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