55 votes

Comment gérer une sous-requête IN avec LINQ to SQL?

Je suis un peu coincé là-dessus. En gros, je veux faire quelque chose comme la requête SQL suivante dans LINQ to SQL:

 SELECT f.* 
FROM Foo f
WHERE f.FooId IN (
    SELECT fb.FooId
    FROM FooBar fb
    WHERE fb.BarId = 1000
)
 

Toute aide serait reçue avec gratitude.

Merci.

87voto

aku Points 54867

Manière générale d'implémenter IN dans LINQ to SQL

 var q = from t1 in table1
        let t2s = from t2 in table2
                  where <Conditions for table2>
                  select t2.KeyField
        where t2s.Contains(t1.KeyField)
        select t1;
 

Manière générale d'implémenter EXISTS dans LINQ to SQL

 var q = from t1 in table1
        let t2s = from t2 in table2
                  where <Conditions for table2>
                  select t2.KeyField
        where t2s.Any(t1.KeyField)
        select t1;
 

65voto

Samuel Jack Points 14556

Regardez cet article . En gros, si vous voulez obtenir l'équivalent d'IN, vous devez d'abord créer une requête interne, puis utiliser la méthode Contains (). Voici ma tentative de traduction:

 var innerQuery = from fb in FoorBar where fb.BarId = 1000 select fb.FooId;
var result = from f in Foo where innerQuery.Contains(f.FooId) select f; 

3voto

Jordan Arron Points 20994
from f in Foo
    where f.FooID ==
    	(
    		FROM fb in FooBar
    		WHERE fb.BarID == 1000
    		select fb.FooID

    	)
    select f;

2voto

Daren Thomas Points 26812

Essayez d’utiliser deux étapes distinctes:

 // create a Dictionary / Set / Collection fids first
var fids = (from fb in FooBar
            where fb.BarID = 1000
            select new { fooID = fb.FooID, barID = fb.BarID })
            .ToDictionary(x => x.fooID, x => x.barID);

from f in Foo
where fids.HasKey(f.FooId)
select f
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X