2008-12-15 8 views

Répondre

7

Vous pouvez essayer:

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; 

Je ne sais pas si cela fonctionnera bien - une raison pour laquelle vous ne voulez pas juste une jointure ne place? Par exemple:

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

Il quelqu'un a besoin d'être un » autre est en tapant exactement la même réponse que vous "popup d'état sur ce site :) –

+1

Raison de ne pas rejoindre: Si x est de 1 à plusieurs avec y, la jointure donnera des x dupliqués. –

+0

@DavidB: True. Je me demande ce que l'ajout d'un appel à Distinct() à la fin ferait ... –

8

Pour faire un IN en SQL, vous devez utiliser la fonction Contient dans Linq.

Ainsi, par exemple:

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

Vous pouvez également définir la requête LINQ intérieure séparement si vous voulez, qui est un peu plus lisible

+0

Qu'est-ce que cela signifie pour la performance? Y aura-t-il une différence dans la définition de la requête contra en l'utilisant en ligne? – Dimse

+0

Aucune différence du tout. –

5

Je cherchais une solution NOT IN pour LINQ to SQL. Merci à cette question, j'ai pu google la bonne chose et trouver ce blog: 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

cette réponse m'a beaucoup aidé, merci! J'ai une configuration de classe où une classe détient une liste (de classe2) dont chacune contient une liste (de classe3) (pour imiter un conteneur, un bon de réception de marchandises et des marchandises recevant des bons dans un entrepôt). Besoin de trouver un moyen de rechercher une partie spécifique dans Class3 tout en commençant à Class1 sans pour chaque boucle à travers chaque instance de classe. Cela fonctionne très bien (sans le pas pour moi)! – RianBattle