Entity Framework inclure les cas Où
Si j'ai une requête qui ressemble à ceci:
var forms = repo.GetForms().Where(f => f.SubForms.Any(sf => sf.Classes.Any(c => c.TermId == termId)));
De cela, vous pouvez voir mon schéma est comme suit:
SubForm
a beaucoup de Class
qui a beaucoup de Term
.
Ce que je veux:
Tous SubForms
avec leur Classes
En particulier Term
.
Ce qui se passe maintenant c'est que j'ai tous les SubForm
qui a tout Class
en particulier Term
. Cela signifie que SubForm
revient avec TOUS enfant Class
et pas seulement ceux liés à la Term
.
Pour eg. J'ai 2 termes, un sous-formulaire avec 2 classes de chaque terme. Cette requête renvoie 4 classes au lieu de 2 dans ce mandat particulier.
Est-il Include('Expression')
que je peux utiliser pour dire que je ne veux inclure toutes les classes sur la base d'un état? Ou est ma requête mal?
- La première
Any
est censé être unWhere
, droit? Sinon, votre requête serait juste de retour d'unbool
, en disant: "Est-il un sous-formulaire qui a des classes avec des termes avec le termId, oui ou non?" - Désolé, il y a aussi un autre niveau sur le dessus de cette expression, je vais modifier ça, désolé
Vous devez vous connecter pour publier un commentaire.
Utiliser ceci:
Mise à JOUR: basé sur @Slauma commentaire:
Si vous souhaitez charger
SubForm
s qu'ils ont toutClass
qui a unTerm
partermId
, vous pouvez aller à partir de la fin pour commencer; comme ceci:OU dans une meilleure façon, vous pouvez utiliser
Include
sur votreTerm
, voir:REMARQUE: Que je comprends de votre question, vous avez une relation comme ceci:
Mais, votre code fourni est montrant une relation comme celle-ci:
Si vous le pouvez, mettez vos entités en question, ou d'expliquer leur relation plus s'il vous plaît. Merci.
GetSubForms
etSelect
:Where(sf => sf.Classes.Any(c => c.TermId == termId))
. Sinon, vous devez charger tous sous-formulaires à partir de la DB, y compris les sous-formulaires avec des classes avec l'absence de correspondance termId.Any
dans la question est source de confusion. Je viens d'écrire un commentaire sous la question parce que je crois qu'il voulait dire en fait unWhere
.end-to-begin
motif; je n'ai pas gagné et VS, il suffit maintenant de tester les codes; afin de tester s'il vous plaît et laissez-moi savoir si il ya un problème.Un
Include(Where Expression)
n'existe pas. Si vous utilisez avide de chargement avec vous sera toujours à la charge de tous les éléments.Il y a un moyen de contourner cela en utilisant des projections. L'idée de base est, vous devrez sélectionner un nouveau type anonyme avec la propriété que vous souhaitez et un autre bien avec le filtre de navigation des articles. EF lien ces ensemble et, par conséquent, vous faux un
Include(Where ... )
Cocher pour un exemple.
Include(Expression)
n'existe en tant que Système.Les données.De l'entité.DbExtensions.Citons l'extension de la méthode, mais a un sens totalement différent. Il est utilisé comme une alternative à des littéraux de chaîne:repo.Terms.Include(term => term.Classes)
.Vous savez, parfois je commence à être perdu dans la fantaisie LINQ méthodes d'extension et de tenter de comprendre comment avec impatience charge exactement ce que je veux, et le recours à un très simple "rejoindre" concept.
C'est une simple jointure qui utilise prédéfinis propriétés de navigation (par conséquent, vous n'avez pas à spécifier la condition de jointure). Vous revenez d'un type anonyme, avec tout ce dont vous avez besoin. La beauté de ceci est que, Entity Framework faire de l'auto-correction pour vous, à cet effet, vous êtes libre de retourner le sous-Forum qu'à partir de votre méthode si vous le souhaitez, il contiendra automatiquement la Classe et la période subséquente des références.
Je ne sais pas le nom exact des relations, mais il devrait être quelque chose le long des lignes de
Ce qui semble être une demande commune, il était difficile de trouver une solution à ça quand j'étais à la recherche plus tôt cette année. J'ai fini par utiliser la solution proposée dans le lien ci-dessous (je ne suis pas sûr que c'est exactement la solution que j'ai trouvé, mais c'est la même idée). Espérons que cette aide!
Filtrer les "Comprend" table sur requête Entity Framework