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 № 1Musisz 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.