我已经写了这段代码
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; }
我没有配置外键字段,因为在我的情况下MainTable
和RelatedTable
之间的关系是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,