2009-06-17 8 views
8

Esto debería ser fácil, pero simplemente no puede resolverlo yo mismo, la interfaz no es lo suficientemente intuitiva ... :(Selección de todos los objetos secundarios en LINQ

Digamos que tengo una tabla State, y Quiero seleccionar todos Counties de múltiples States en SQL sería:.

select c.* 
    from State s join County c on c.StateCode = s.StateCode 
where s.TimeZone = -5 -- or some other criteria 

El ejemplo anterior es bastante trivial para convertir a LINQ en un contexto estático:

var q = MyDataContext.GetTable<County>().Where(c => c.State.TimeZone = -5); 

Pero donde empieza a ser complicado es si quiero una consulta más sensible al contexto, como las siguientes:

public static List<County> GetCountiesForStates(List<State> states) { 
    // gotta do something to return all the counties for all these states 
} 

Ahora podría hacer algo como esto dentro de ese método:

var q = MyDataContext.GetTable<County>().Where(c => states.Contains(c.State)); 

pero OMI eso es realmente poco elegante, porque (a) tengo que obtener un MyDataContext estático en lugar de usar el contexto de datos implícitos de los objetos de Estado y (b) estás trabajando hacia atrás, y si comienzas a complicar aún más la consulta, se vuelve aún más feo.

¿Hay una manera de iniciar la consulta con:

var q = states... // or "from s in states..." 

Instintivamente, yo quiero creer que puede hacer esto, pero todavía no he encontrado el camino ...

Respuesta

26

Puede haga esto:

var q = from c in countries 
     from s in c.States 
     where c.Property == Something 
     select s; 

Esto le dará una enumeración de todos los estados de todos los países. Esto se traduce en lo siguiente:

var q = countries.Where(x => c.Property == Something).SelectMany(c => c.States); 
+4

+1 para incluir la expansión lambda. –

+0

Justo lo que quería, ¡GRACIAS! –

+3

Sólo un pequeño error tipográfico: debería ser "countries.Where (c => c.Property) etc ... –

Cuestiones relacionadas