2009-08-13 13 views
5

Tengo 2 tablas que se relacionan entre sí¿Cómo hago esto en Entity Framework (multiple where's o Join)?

La Tabla A tiene una relación de 1 a muchos con la tabla B, por lo que crea una propiedad de navegación en cada una.

Ahora necesito verificar un valor de la Tabla A (userName) y necesito verificar un valor de la tabla B (ClubId).

Así que en mi mente sería algo así como

Join the tables together 
Where A.userName == "bob" && 
where B.clubId == "Car" 

// return the count. 

pero ahora sé con Entidad cosas que debería hacer que se une menos común, así que estoy preguntando si puedo hacerlo con una unirse a continuación.

yo probamos este

int count = Entity.TableA.where(a => a.userName == "bob" && a.TableB.where(i => i.ClubId == "Car")).Count(); 

por lo que este no funciona, ya que no devolverá el tipo correcto (el segundo dónde). Así es como pensé en la forma en que esperaría que se hiciera funcionaría.

Entonces, ¿cómo debería verse?

P.S

Prefiero he hecho un ejemplo de las consultas LINQ método como lo hice anteriormente.

Respuesta

4

Filtrado TableA antes de que su unión es probablemente más eficiente:

var clubs = from a in Entity.TableA 
      where a.userName == "bob" 
      from b in a.TableB 
      where b.clubId == "Car" 
      select b; 

var count = clubs.Count(); 

Usted no tiene que utilizar dos variables, es sólo mi preferencia aquí para mayor claridad.

O en la sintaxis del método se puede simplificar un poco:

var count = Entity.TableA.Where(a => a.userName == "bob") 
         .SelectMany(a => a.TableB) 
         .Count(b => b.clubId == "Car"); 

Sin embargo, no estoy seguro de EF entiende esas expresiones particulares. De lo contrario, el compilador traduciría la consulta anterior de la siguiente manera:

var count = Entity.TableA.Where(a => a.userName == "bob") 
         .SelectMany(a => a.TableB, (a,b) => new { a, b }) 
         .Where(x => x.b.clubId == "Car") 
         .Count(); 
+0

Ah. Wow. No estoy seguro de qué es lo que más me gusta de su caso. Ese selectMany me despluma. Entonces, ¿qué sucede si necesito otro filtro? ¿Añadiría otro selectMany? Bueno, la primera sintaxis de método funciona. No sé si baja internamente y hace lo segundo. Todas las consultas tomarían el mismo tiempo de ejecución. Lo que está en el segundo, lo hace SelectMany uno. como lo que es a => a.TableB, (a, b) =>) hacer? – chobo2

+0

He actualizado la publicación con una corrección en la traducción de la consulta. El primer SelectMany esencialmente "aplana" su colección anidada, devolviendo una secuencia de todas las B de todas las A. El segundo SelectMany acepta dos delegados, un "collectionSelector" para recuperar la colección de B de una A y un "resultSelector" para especificar el valor de retorno dado un A y un B.LINQ simplemente selecciona ambos objetos de entrada, para usar en el resto de su consulta. – dahlbyk

5

Asumiendo que su modelo de EF tiene la relación entre los usuarios y los clubes podrían hacer algo como esto:

var usersNamedBobInCarClub = 
      from A in User 
      from B in A.Clubs 
      where A.userName == "bob" && 
        B.clubId == "Car" 
      select A; 

Si desea que los elementos de los usuarios y los clubes volver echar un vistazo a une dentro de la consulta.

+0

Lo intentaré, pero ¿cómo hago eso en las consultas del método Linq? – chobo2