/ / Entity Framework Filtre simple par NavigationProperty à l'aide des méthodes LINQ - linq, structure-entité, linq-à-entités, syntaxe linq-method

Entity Framework Simple Filter par NavigationProperty à l'aide des méthodes LINQ - linq, entity-framework, linq-to-Entités, syntaxe linq-method

J'apprends EF et LINQ à EF. Nous utilisons les méthodes LINQ et non les expressions LINQ.

J'essaie de faire une requête très simple à partir de mes 2 entités.

NavigationGroup est une relation un à plusieurs avec NavigationGroupLocation. La propriété de navigation dans NavigationGroup est appelée "NavigationGroupLocations".

Dans mon esprit, ce code devrait fonctionner:

 List<NavigationGroup> groups = db.DataModel.NavigationGroups.Where(g => g.NavigationGroupLocations.Location == 1).ToList();

L'emplacement est un int dans mon entité NavigationGroupLocation.

Quelqu'un peut-il expliquer pourquoi cela ne fonctionne pas etquel est le bon moyen de filtrer par une propriété de navigation? J’ai vu beaucoup d’exemples dans la syntaxe d’expression et je ne peux pas sembler la relier à la syntaxe de la méthode.

J'utilise C # 4 et EF 4.

Merci pour l'aide!

MODIFIER

Je vois que, puisque ma propriété de navigation est une collection, je ne peux pas accéder à une propriété individuelle. J’essaie donc ce code:

 .Where(g => g.NavigationGroupLocations.Any(l => l.Location == 1));

Lorsque j'essaie de l'exécuter, j'obtiens cette erreur:

 Cannot implicitly convert type "System.Linq.IQueryable<ME.Data.ECom.NavigationGroup>" to "System.Data.Objects.ObjectSet<ME.Data.ECom.NavigationGroup>". An explicit conversion exists (are you missing a cast?)

Que devrais-je faire?

Réponses:

0 pour la réponse № 1

Vous devez faire une jointure. NavigationGroupLocations est une liste d'éléments, de sorte que vous ne pouvez pas accéder .Location propriété dans la clause where.


0 pour la réponse № 2

Cela ressemble à ceci fonctionne:

 var query = db.DataModel.NavigationGroups.Where(g => g.NavigationGroupLocations.Any(l => l.Location == selectedLocation));

Il ne fonctionne pas lorsqu'il est utilisé en tant qu'instruction conditionnelle.

 var query = db.DataModel.NavigationGroups;
if (selectedLocation > 0)
{
query = query.Where(g => g.NavigationGroupLocations.Any(l => l.Location == selectedLocation));
}

C'est quand j'obtiens l'erreur.