Невозможно сравнить элементы типа "System.Collections.Generic.ICollection`1 Поддерживаются только примитивные типы, типы перечисления и типы сущностей
Я написал этот код
IQueryable<Site> sites = context.MainTable.Include("RelatedTable");
if (!string.IsNullOrEmpty(param1)) {
sites = sites.Where(s => s.RelatedTable != null && s.RelatedTable.Any(p => p.Name == param1.ToLower() && p.PolicyType == "primary"));
}
foreach (string secondaryPolicy in secondaryPolicies)
{
sites = sites.Where(s => s.RelatedTable != null && s.RelatedTable.Any(p => p.Name == secondaryPolicy.ToLower() && p.PolicyType == "secondary"));
}
return sites.ToList();
Однако в строке ToList
я получаю исключение
Невозможно сравнить элементы типа 'System.Collections.Generic.ICollection`1 [[Project1, Version = 1.0.0.0, Культура = нейтральная, PublicKeyToken = null]] '. Только примитивные типы, типы перечислений и типы объектов поддерживаются.
Ответы
Ответ 1
Вы не можете напрямую сравнивать связанную таблицу с null
. Вместо этого сравните с вашим членом внешнего ключа (при условии, что PrimaryTable
ссылка RelatedTable
с помощью члена с именем RelatedTableId
.
sites.Where(s => s.RelatedTableId != null && s.RelatedTable.Any(
p => p.Name == param1.ToLower() && p.PolicyType == "primary"));
Вы даже можете полностью уйти с удалением нулевой отметки. Поскольку этот запрос выполняется в базе данных, вы не получите NullReferenceException
, и он может работать. Вам придется дважды проверить это.
Ответ 2
Это потому, что у вас есть нулевая проверка в предложении where.
Ответ 3
Ошибка при сборе коллекции навигации по сравнению с нулевым значением. Следует проверить, существует ли какая-либо запись. В конкретном примере Any все равно используется, поэтому проверка коллекции на null избыточна
Некорректное
dbContext.MainTable.Where(c => c.RelatedTable==null )
Правильно
dbContext.MainTable.Where(c => !c.RelatedTable.Any() )
Ответ 4
Поле сбора может быть пустым, в этом случае вы получите исключение NullReferenceException
при использовании RelatedTables.Any()
Если вы добавите RelatedTables != null
как в вопрос, вы можете получить
Невозможно сравнить элементы типа 'System.Collections.Generic.ICollection`1 [[Project1, Version = 1.0.0.0, Культура = нейтральная, PublicKeyToken = null]] '. Только примитивные типы, типы перечислений и типы объектов поддерживаются.
Если вы получаете исключение NullReferenceException
, ленивая загрузка не отключается, и вы хорошо относитесь к ленивой загрузке для поля, а затем для исключения поля метки исключения с ключевым словом virtual
для обеспечения ленивой загрузки для поля
virtual ICollection<Table> RelatedTables{ get; set; }
Ответ 5
У меня не настроено поле внешнего ключа, потому что отношение между MainTable
и RelatedTable
в моем случае составляет 1 к 1. Однако для отношения 1 ко многим, если у вас нет внешнего ключа, но у вас есть свойство навигации к модели MainTable
в модели RelatedModel
также работает следующее решение.
1 к 1
var result = from s in context.Sites
join r in context.RelatedTable on s.Id equals r.Id
select s;
return result;
1 ко многим
var result = from s in context.Sites
join r in context.RelatedTable on s.Id equals r.Site.Id
into rs
where rs.RelatedTable.Any(p => p.Name == param1.ToLower() && p.PolicyType == "primary")
select s
Ответ 6
Это работает, я просто удаляю нулевую проверку;
правильно:
Результат =
db.EmpTable.FirstOrDefault().ProjectsAssign.Name,