2008-12-15 13 views

Antwort

7

Sie könnten versuchen:

var yIds = from y in dataContext.Y 
      where ... 
      select y.XId; 

var query = from x in dataContext.X 
      where yIds.Contains(x.Id) 
      select x; 

Ich weiß nicht, ob es aber funktionieren wird - keinen Grund, warum Sie wollen nicht nur zu, anstatt eine Verknüpfung tun? Zum Beispiel:

var query = from x in dataContext.X 
      join y in dataContext.Y.Where(...) on x.Id equals y.Xid 
      select x; 
+2

Es muss eine „jemand anderes sein ist Geben Sie genau die gleiche Antwort wie Sie "Status-Popup auf dieser Website :) –

+1

Grund, nicht beizutreten: Wenn x 1 zu viele mit y ist, wird die Verknüpfung doppelte X geben. –

+0

@DavidB: Wahr. Ich frage mich, was das Hinzufügen eines Aufrufs zu Distinct() am Ende tun würde ... –

8

einen IN in SQL zu tun, müssen Sie die Funktion enthält in Linq verwenden.

So zum Beispiel:

var query = from x in GetX() 
      where (from y in GetY() select y.xID).Contains(x.xID) 
      select x; 

Sie könnten auch die innere Linq-Abfrage separat definieren, wenn Sie möchten, die ein bisschen mehr lesbar

+0

Was bedeutet das für die Leistung? Wird es einen Unterschied bei der Definition der Query Contra geben, die es inline verwendet? – Dimse

+0

Kein Unterschied. –

5

I wurde für LINQ to SQL für eine NOT IN Lösung suchen. Dank dieser Frage konnte ich google das Richtige und finden dieses Blog-Post: The NOT IN clause in LINQ to SQL

C#

NorthwindDataContext dc = new NorthwindDataContext(); 
var query = 
    from c in dc.Customers 
    where !(from o in dc.Orders 
      select o.CustomerID) 
      .Contains(c.CustomerID) 
    select c; 

VB.net

Dim db As New NorthwinDataContext() 
Dim query = From c In dc.Customers _ 
      Where Not (From o in dc.Orders _ 
         Select o.CustomerID).Contains(c.CustomerID) _ 
      Select c 
+0

diese Antwort hat mir sehr geholfen, danke! Ich habe ein Klassen-Setup, bei dem eine Klasse eine Liste (von Klasse2) enthält, von denen jede eine Liste (von Klasse3) enthält (um einen Container, Warenempfangsbeleg und Warenempfangsbelegzeilen in einer Lagereinrichtung nachzuahmen). Sie müssen eine Möglichkeit finden, nach einem bestimmten Teil in Class3 zu suchen, während Sie mit Class1 beginnen, ohne dass For Each jede Klasseninstanz durchläuft. Das funktioniert super (ohne das für mich nicht)! – RianBattle