2008-09-09 7 views

Respuesta

55

Tenga una mirada en this article. Básicamente, si desea obtener el equivalente de IN, primero debe construir una consulta interna y luego usar el método Contiene(). Aquí está mi intento de traducción:

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

Gracias por el enlace, eso era justo lo que necesitaba. Gracias a todos los demás por sus respuestas también. –

+2

Es posible que tenga un mejor rendimiento al construir un diccionario con la primera consulta, ya que la llamada Contiene() en la segunda consulta se puede hacer en O (1) en oposición a O (n). –

+7

Daren, LINQ to SQL se transformará en consulta SQL. El diccionario será útil al iterar sobre la colección de objetos. – aku

2

Intente utilizar dos etapas separadas:

// 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

¿Esto realmente funciona? Tengo problemas creyendo que ... –

0

Prueba este

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

manera general a aplicar en la en 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; 

manera general para poner en práctica existe en LINQ a 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

Rápido y al grano - excelente respuesta. A pesar de que la construcción de la consulta interna en una declaración separada es definitivamente clara, también podría saber cómo hacerlo en línea. ¡Gracias! –

+0

@aku ¿Es este método preferible al método de @Samuel Jack? –

+0

Esto es mucho más legible que la sintaxis de encadenamiento de métodos. Gracias. –

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

// crear un diccionario/conjunto/colección fids primero

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

// crear un diccionario/Set/Colección fids primeros

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 
};