2016-05-24 3 views
1

Я пытаюсь выбрать с помощью linq левое соединение, чтобы найти все продукты, которые никогда не были заказаны более чем за 50 за раз. Я не уверен, что случилось. Это то, что я сделал, но я не получаю правильный ответ.Выбор левого соединения с помощью linq и условия

Это мой код:

var q5 = from p in db.Products 
       join o in db.Orders on p.ProductID equals o.OrderID 
       join od in db.Order_Details on o.OrderID equals od.OrderID 
       where od.Quantity < 50 
       select p.ProductID; 
     foreach (var p in q5) 
     { 
      Console.WriteLine(p); 
     } 

ответ

0

Вы хотите, чтобы найти продукты, которые были никогда заказывается более 50 в то время. Так что присоединиться к заказам не очень помогает. Вы можете использовать этот подход:

var productsWithLowOrders = db.Products 
    .Where(p => !db.Orders 
     .Any(o => p.ProductID == o.OrderID && db.Order_Details 
      .Any(od => o.OrderID == od.OrderID && od.Quantity >= 50))); 

Этот запрос использует Enumerable.Any, в SQL он будет переведен на подзапросы для связанных таблиц с использованием NOT EXISTS + EXISTS.

+0

Что-то не работает с querie – coco

+0

синтаксис не является правильным. – coco

+0

@coco: Я не вижу проблемы. Какое точное сообщение? –

0

Так что это лучшее решение, которое я нашел:

var q5 = from p in db.Products 
       from od in db.Order_Details 
       .Where (od => od.ProductID == p.ProductID) 
       .Where (od=> od.Quantity > 50).DefaultIfEmpty() 
       select (od.OrderID !=null ? "-" : p.ProductName) 
       ; 
     foreach (var p in q5) 
     { 
      if(p != "-") 
      { 
       Console.WriteLine(p); 
      } 
     } 
Смежные вопросы