Entity Framework: невозможно создать постоянное значение типа "System".Коллекции.Родовой.То IList`1'

Это вызвало у меня нет сегодня проблем. У меня есть этот простой запрос

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

последняя строка этого запроса вызывает у меня проблемы

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

ошибки он выдает

не удалось создать постоянное значение типа - Система.Коллекции.Родовой.То IList`1'. Только примитивные типы ('такие как Int32, String и Guid') поддерживаются в этом контексте.

Я даже не пытаюсь создать список. Все, что я пытаюсь сделать здесь возвращается размещение, которое связано с местом (где имя места в таблице места, которое связано с таблицей размещения через таблицу AccommodationPlaceJoin), равно любому из названий мест в критериях.Местоположения (который имеет тип IList).

Я попытался изменить эту строку на эту, но это не сработало.

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

1 ответов


постоянное значение EF не может создать null для сравнения criteria.Locations == null. Вам нужно разделить запрос на два случая и выполнить проверку пустого списка вне запроса, например так:

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)));
}

редактировать

BTW: составление всего запроса сделает его более читаемым, на мой взгляд, и упростит SQL, который должен быть отправлен в базу данных:

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