Подтвердить что ты не робот

Невозможно сравнить элементы типа "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]] '. Только примитивные типы, типы перечислений и типы объектов поддерживаются.

4b9b3361

Ответ 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,