/ / Entity Framework Simple Filter by NavigationProperty przy użyciu metod LINQ - linq, entity-framework, linq-to-podmiotów, linq-method-syntax

Prosty filtr Entity Framework od NavigationProperty przy użyciu metod LINQ - linq, entity-framework, linq-to-entity, składnia-metody-linq

Uczę się EF i LINQ do EF. Używamy metod LINQ, a nie wyrażeń LINQ.

Próbuję wykonać bardzo proste zapytanie z moich 2 podmiotów.

NavigationGroup to relacja jeden do wielu w stosunku do NavigationGroupLocation. Właściwość nawigacji w NavigationGroup nosi nazwę „NavigationGroupLocations”

Moim zdaniem ten kod powinien działać:

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

Lokalizacja to int w mojej jednostce NavigationGroupLocation.

Czy ktoś może wyjaśnić, dlaczego to nie działa ijaki jest właściwy sposób filtrowania według właściwości nawigacji? Widziałem wiele przykładów w składni wyrażeń i nie wydaje się, aby odnosiły się do składni metody.

Używam C # 4 i EF 4.

Dzięki za pomoc!

EDYTOWAĆ

Widzę, że ponieważ moja Właściwość nawigacji jest kolekcją, nie mogę dostać się do pojedynczej właściwości. Próbuję więc tego kodu:

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

Gdy próbuję go uruchomić, pojawia się ten błąd:

 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?)

Co powinienem robić?

Odpowiedzi:

0 dla odpowiedzi № 1

Musisz zrobić Join. NavigationGroupLocations to lista elementów, więc nie masz dostępu .Location właściwość w klauzuli where.


0 dla odpowiedzi nr 2

Wygląda na to, że to działa:

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

Nie działa, gdy jest używany jako instrukcja warunkowa.

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

Wtedy dostaję błąd.