Entity Framework: nie można utworzyć stałą wartość typu "System".Kolekcja.Porodowy.To IList`1'

To spowodowało u mnie nie ma dziś problemów. Mam ten prosty wniosek

var result =
    DataContext.Accommodations.Where(a => 
        (criteria.MinPrice == null || a.AccommodationRates.Any(r => r.From >= criteria.MinPrice)) &&
        (criteria.MaxPrice == null || a.AccommodationRates.Any(r => r.To <= criteria.MaxPrice)) &&
        (criteria.Locations == null || criteria.Locations.Count == 0 || a.AccommodationPlaceJoins.Any(j => criteria.Locations.Contains(j.Place.PlaceName)))
);

ostatni wiersz tego żądania powoduje u mnie problemy

(criteria.Locations == null ||
 criteria.Locations.Count == 0 ||
 a.AccommodationPlaceJoins.Any(j => criteria.Locations.Contains(j.Place.PlaceName)))

błąd, którą on daje, to

nie udało się utworzyć stałą wartość typu - System.Kolekcja.Porodowy.To IList`1'. Tylko prymitywne typy ('takie jak Int32, String i Guid') są obsługiwane w tym kontekście.

Ja nawet nie próbuję utworzyć listę. Wszystko, co staram się zrobić proszę zwrócić noclegi, które są związane z miejscem, gdzie nazwa miejsca w tabeli miejsc, która jest połączona z tabelą noclegów przez tabelę AccommodationPlaceJoin), i tak każdemu z nazw miejsc w kryteriach.Lokalizacji (który ma typ IList).

próbowałem zmienić ten wiersz na ten temat, ale to nie zadziałało.

(criteria.Locations == null ||
 criteria.Locations.Count == 0 ||
 a.AccommodationPlaceJoins.Any(j => criteria.Locations.Any(l => l == j.Place.PlaceName)))

stałą wartość EF nie może utworzyć -null dla porównania criteria.Locations == null. Trzeba podzielić zapytanie na dwa przypadki i wykonać test pustej listy poza zapytania, np.:

var result = DataContext.Accommodations.Where(a => 
    (criteria.MinPrice == null || 
        a.AccommodationRates.Any(r => r.From >= criteria.MinPrice)) &&
    (criteria.MaxPrice == null ||
        a.AccommodationRates.Any(r => r.To <= criteria.MaxPrice)));

if (criteria.Locations != null && criteria.Locations.Count > 0)
{
    result = result.Where(a => a.AccommodationPlaceJoins
        .Any(j => criteria.Locations.Contains(j.Place.PlaceName)));
}

Edit

BTW: opracowanie całego żądania będzie bardziej czytelny, moim zdaniem, i ułatwi SQL, który powinien być wysłany do bazy danych:

IQueryable<Accommodation> result = DataContext.Accommodations;

if (criteria.MinPrice != null)
    result = result.Where(a => a.AccommodationRates
        .Any(r => r.From >= criteria.MinPrice));

if (criteria.MaxPrice != null)
    result = result.Where(a => a.AccommodationRates
        .Any(r => r.To <= criteria.MaxPrice));

if (criteria.Locations != null && criteria.Locations.Count > 0)
    result = result.Where(a => a.AccommodationPlaceJoins
        .Any(j => criteria.Locations.Contains(j.Place.PlaceName)));