2016-05-24 7 views
1

Ich versuche mit Linq eine linke Join zu finden, um alle Produkte zu finden, die nie mehr als 50 auf einmal bestellt wurden. Ich bin mir nicht sicher, was falsch ist. Das habe ich gemacht, aber ich bekomme nicht die richtige Antwort.Linke Join Auswahl mit Linq und eine Bedingung

Dies ist mein Code:

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); 
     } 

Antwort

0

Sie wollen Produkte finden, die waren nie mehr als 50 zu einem Zeitpunkt bestellt werden. So hilft ein Beitritt zu Bestellungen nicht viel. Sie könnten diesen Ansatz:

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))); 

Diese Abfrage Enumerable.Any, in SQL verwendet, es wird zu Unterabfragen auf die zugehörigen Tabellen übersetzt werden mit NOT EXISTS + EXISTS.

+0

etwas nicht mit Ihrem querie arbeitet – coco

+0

die Syntax ist nicht korrekt. – coco

+0

@coco: Ich sehe das Problem nicht. Was ist die genaue Nachricht? –

0

So ist dies die beste Lösung, die ich gefunden:

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); 
      } 
     }