无法比较类型为"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,文化=中立,都必须null]]"。只有原始类型,支持枚举类型和实体类型。

您不能直接将相关表与null进行比较。相反,与外键成员进行比较(假设PrimaryTable使用名为RelatedTableId的成员引用RelatedTable)。

sites.Where(s => s.RelatedTableId != null && s.RelatedTable.Any(
    p => p.Name == param1.ToLower() && p.PolicyType == "primary"));

您甚至可以完全取消null检查。因为这个查询是针对数据库运行的,所以您不会得到NullReferenceException,它可能会工作。不过你得再检查一下

这是因为您在where子句中有一个空检查。

如果将导航集合与null进行比较,则可能发生错误。应该检查是否存在任何记录。在特定的示例中,无论如何使用Any,因此检查集合为null是多余的

dbContext.MainTable.Where(c => c.RelatedTable==null )
正确

dbContext.MainTable.Where(c => !c.RelatedTable.Any() )

Collection字段可以为null,在这种情况下您会得到异常NullReferenceException

当使用RelatedTables.Any()

如果您在问题中添加RelatedTables != null,则可以得到

不能比较类型的元素"System.Collections.Generic。ICollection ' 1 [[Project1, Version = 1.0.0.0,文化=中立,都必须null]]"。只有原始类型,支持枚举类型和实体类型。

如果你得到NullReferenceException异常,延迟加载没有被关闭,并且你对延迟加载字段很好,然后用virtual关键字标记字段以允许延迟加载字段

virtual ICollection<Table> RelatedTables{ get; set; }

我没有配置外键字段,因为在我的情况下MainTableRelatedTable之间的关系是1对1。但是,对于1对多关系,如果您没有外键,但在RelatedModel模型中有指向MainTable模型的导航属性,则以下解决方案也适用。

1 to 1

  var result = from s in context.Sites
               join r in context.RelatedTable on s.Id equals r.Id
               select s; 
  return result;

1 to many

  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

我也有同样的情况。然后通过比较null与FirstOrDefault()来传递它。在你的情况下,我按照以下

申请
    sites = sites.Where(s => s.RelatedTable.FirstOrDefault() != null && s.RelatedTable.Any(p => p.Name == param1.ToLower() && p.PolicyType == "primary"));

它工作我,我只是删除null检查;

正确的:结果=

db.EmpTable.FirstOrDefault().ProjectsAssign.Name,

不正确:结果=

db.EmpTable!=null && db.EmpTable.FirstOrDefault().ProjectsAssign!=null ? 
      db.EmpTable.FirstOrDefault().ProjectsAssign.Name : null,

最新更新