2008-09-09 7 views

Odpowiedz

55

Wystarczy popatrzeć na this article. Zasadniczo, jeśli chcesz uzyskać odpowiednik IN, musisz najpierw zbudować zapytanie wewnętrzne, a następnie użyć metody Contains(). Oto moja próba tłumaczenia:

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;
+0

Dzięki za link - to było właśnie to, czego potrzebowałem. Dziękuję wszystkim za odpowiedzi. –

+2

Możesz mieć lepszą wydajność przy konstruowaniu Słownika z pierwszym zapytaniem, ponieważ wywołanie Contains() w drugim zapytaniu może być wykonane w O (1) w przeciwieństwie do O (n). –

+7

Daren, LINQ do SQL zostanie przekształcone w zapytanie SQL. Słownik będzie przydatny podczas iteracji nad kolekcją obiektów. – aku

2

Spróbuj użyć dwa odrębne etapy:

// 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 
3
from f in Foo 
    where f.FooID == 
     (
      FROM fb in FooBar 
      WHERE fb.BarID == 1000 
      select fb.FooID 

     ) 
    select f; 
+8

Czy to naprawdę działa? Mam kłopoty z wiarą w to, że ... –

0

Spróbuj

var fooids = from fb in foobar where fb.BarId=1000 select fb.fooID 
var ff = from f in foo where f.FooID = fooids select f 
80

ogólny sposób wdrożyć w w 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; 

sposób ogólny do realizacji istnieje w 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; 
+0

Szybko i na temat - świetna odpowiedź. Mimo że budowanie wewnętrznego zapytania w oddzielnej instrukcji jest zdecydowanie jasne, może równie dobrze wiedzieć, jak to zrobić w linii. Dzięki! –

+0

@aku Czy ta metoda jest lepsza od metody @Samuel Jack? –

+0

Jest to znacznie bardziej czytelne niż składnia łańcuchów metod. Dzięki. –

0
var foos = Foo.Where<br> 
(f => FooBar.Where(fb.BarId == 1000).Select(fb => fb.FooId).Contains(f.FooId)); 
1

// utwórz słownik/zestaw/kolekcję najpierw:

Find Other Artilces

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 
0

// Utworzenie FIDS słownik/Set/kolekcja pierwsze

Find Other Artilces

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 
0
from f in foo 
where f.FooID equals model.FooBar.SingleOrDefault(fBar => fBar.barID = 1000).FooID 
select new 
{ 
f.Columns 
};