2016-07-29 32 views
0

Ich hoffe, kann mir helfen, ich bin neu in linq, Ich habe 2 Tabellen Name Tblcart und tbloderdetail: Ich zeige nur einige Felder in diesen beiden Tabellen zu zeigen, was mein Problem ist:Join zwei Tabellen in Linq mit Sonderkonditionen

tblCart: ID, cartId, Barcode,

und tblOrderDetail: ID, cartId, IsCompleted Barcode

, wenn jemand einen Auftrag speichern, bevor er seinen Wunsch bestätigt, eine Zeile vorübergehend in den tblCart eingeben, dann, wenn er oder sie bestätigt seinen Wunsch wird eine weitere Zeile in die tblOrderDetail eingeführt werden,

Jetzt möchte ich nicht das zeigen, Zeilen, die in tblOrderDetailed eingefügt werden (zeigt nur vorübergehend Zeilen, die es in TblCart gibt),

Mit anderen Worten, wenn Zeilen in TblCart mit CartID = 1 und gleichzeitig gibt es die gleiche Zeile mit CartID = 1 in tblOrderDetail, dann möchte ich diese Zeile nicht.

Alles in allem nur die Zeilen, dass es in tblOrderDetail ist nicht, und das Feld zu erkennen, diese cartId ist, Ich sollte erwähnen, dass ich IsCompleted = true machen, und damit entweder können wir ausschließen, die Zeilen die wir nicht wollen ,

ich tat dies:

var cartItems = context.tblCarts 
    .Join(context.tblSiteOrderDetails, 
     w => w.CartID, 
     orderDetail => orderDetail.cartID, 
     (w,orderDetail) => new{w,orderDetail}) 
    .Where(a=>a.orderDetail.cartID !=a.w.CartID) 
    .ToList() 

aber es funktioniert nicht.

ein Beispiel:

tblCart: 
ID=1 
CartID=1213 
Barcode=4567 

ID=2 
CartID=1214 
Barcode=4567 

ID=3 
CartID=1215 
Barcode=6576 

tblOrderDetail: 
ID=2 
CartID=1213 
Barcode=4567 
IsCompleted=true 

mit diesen Daten sollte es nur die beiden letzten Reihe in tblCart zeigen, ich meine

ID=2 
CartID=1214 
Barcode=4567 

ID=3 
CartID=1215 
Barcode=6576 
+1

können Sie einige Beispielzeilen für jede Tabelle und dann eine Beispielausgabe Ihrer Abfrage mit diesen Zeilen bereitstellen? – pquest

+0

@pquest yup ofcurse – sariiia

+0

Bitte fügen Sie das Modell des Wagens zu Ihrer Frage hinzu - speziell, haben Sie eine Navigationseigenschaft auf dem Warenkorb, um auf die Details zu verweisen? –

Antwort

0

Das klingt wie ein Fall für WHERE NOT EXISTS in SQL.

übersetzt in etwa diese sollte in LINQ so etwas wie dieses:

var cartItems = context.tblCarts.Where(crt => !context.tblSiteOrderDetails.Any(od => od.CartID == crt.cartID)); 
+0

Danke., Was ich tatsächlich suchte, arbeitete wie ein Charme – sariiia

0

Wenn Sie eine Navigationseigenschaft auf Wagen haben Details zu referenzieren (ich nehme an, es Details genannt wird), dann gilt:

var results=context.tblCarts.Where(c=>!c.Details.Any(d=>d.IsCompleted)); 
+0

Ich testete Ihre Lösung auch, und es war die zweite Lösung für mich, da ich zwei Feld hatte, um mein Problem zu folgen, danke so sehr – sariiia