Comment est-ce que je fais ceci dans Entity Framework (multiple où est ou Rejoignez)?

c# entity-framework linq linq-to-entities

Question

J'ai 2 tables qui ont une relation de bateau

La table A a une relation de 1 à plusieurs avec la table B, ce qui crée une propriété de navigation dans chacune d'elles.

Maintenant, je dois vérifier une valeur de la table A (userName) et je dois vérifier une valeur de la table B (ClubId).

Donc, dans mon esprit, ce serait quelque chose comme

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

// return the count.

mais maintenant, je sais qu'avec les choses Entity, les jointures devraient être moins courantes, alors je me demande si je peux le faire avec une jointure alors.

J'ai essayé ça

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

donc cela ne fonctionne pas car il ne retournera pas le bon type (le 2ème où). C’est justement ainsi que j’ai pensé que, dans l’espace, je pense que cela fonctionnerait.

Alors, à quoi devrait-il ressembler?

PS

J'ai plutôt un exemple dans les requêtes de la méthode Linq comme je l'ai fait ci-dessus.

Réponse acceptée

Filtrer TableA avant votre jointure est probablement plus efficace:

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();

Vous n'êtes pas obligé d'utiliser deux variables, c'est juste ma préférence ici pour plus de clarté.

Ou dans la syntaxe de la méthode, vous pouvez simplifier un peu:

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

Cependant, je ne suis pas certain que EF comprenne ces expressions particulières. Sinon, le compilateur traduirait la requête ci-dessus comme suit:

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();

Réponse populaire

En supposant que votre modèle EF ait une relation entre les utilisateurs et les clubs, vous pouvez obtenir quelque chose comme ceci:

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

Si vous voulez renvoyer des éléments des utilisateurs et des clubs, examinez les jointures dans la requête.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow