2016-01-19 4 views
0

Моя цель - вернуть список заказов, которые содержат только элементы orderItems, которые принадлежат определенному продавцу. Мое текущее решение состоит в повторении через КАЖДЫЙ заказ, затем через каждый элемент заказа и каждый листинг. Я полагаю, что это не лучшая практика, но мне сложно определить, как построить один запрос для получения заказов определенного продавца.Linq InnerJoin 4 таблицы

У меня есть 4 таблицы

Merchants (поле ИД быть merchantID)

Заказов (поле идентификатора идентификатора заказ)

OrderItems (поле идентификатора orderItemID и ФК listingID)

листинги (поле идентификатора - идентификатор ID и FK merchantID)

+0

Вы используете EntityFramework? – jvanrhyn

+1

Вы не хотите перекрестного соединения. Вы хотите внутреннее соединение. –

+0

@jvanrhyn - Да, используя EF – user1698144

ответ

1

Вы можете использовать .Any(), чтобы помочь вам добраться туда, где вы муравей:

var ordersFromMerchant = db.Orders 
    .Where(o => o.Items.Any(oi => oi.Listing.merchantID = 10); 

Я сделал предположение о названиях ваших навигационных свойств, но вы должны быть в состоянии приспособить это, если они не совпадают.

Если вы предпочитаете синтаксис Linq, вы можете использовать:

var ordersFromMerchant = from o in db.Orders 
    join oi in db.orderItems on o.orderID equals oi.orderID 
    join l in db.listings on oi.listingID equals l.listingID 
    where l.merchantID = 10 
    select o; 
+0

'равно 'не' = 'в синтаксисе запроса. –

+0

Спасибо, я обычно использую синтаксис метода расширения! – Richard

+0

Работает как шарм. благодаря – user1698144

1

Я не знаю структуру, но что-то, как это должно работать.

var query = from o in orders 
      join oi in orderItems on o.id equals io.orderID 
      join l in listings on oi.listingID equals l.id 
      where l.merchantID == merchantID 
      select o; 
Смежные вопросы