¿Cómo hago esto en Entity Framework (multiple where's o Join)?

c# entity-framework linq linq-to-entities

Pregunta

Tengo 2 mesas que tienen una relación entre sí.

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

Ahora necesito verificar un valor de la Tabla A (nombre de usuario) 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é que con la Entidad las cosas deberían hacer que las uniones sean menos comunes, así que me pregunto si puedo hacerlo con una unión en ese momento.

Probé esto

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

así que esto no funciona ya que no devolverá el tipo correcto (el segundo donde). Así es como pensé, a lo largo de las líneas, cómo esperaría que funcionara.

Entonces, ¿cómo debería verse?

PD

Prefiero tener un ejemplo hecho en las consultas del método Linq como lo hice anteriormente.

Respuesta aceptada

Filtrar la TableA antes de 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();

No tienes que usar dos variables, es solo mi preferencia aquí para mayor claridad.

O en la sintaxis del método puedes 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 que EF entienda esas expresiones particulares. Si no, el compilador traduciría la consulta anterior de esta 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();

Respuesta popular

Asumiendo que su modelo EF tiene la relación entre los Usuarios y los Clubes podría 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 devolver elementos tanto de los usuarios como de los clubes, eche un vistazo a las combinaciones dentro de la consulta.



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué