我写了这段代码
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”1Project1,版本=1.0.0.0,区域性=neutral,PublicKeyToken=null“的元素。仅支持基元类型、枚举类型与实体类型。
7条答案
按热度按时间qgzx9mmu1#
不能直接将相关表与
null
进行比较,而是与外键成员进行比较(假设PrimaryTable
使用名为RelatedTableId
的成员引用RelatedTable
)。你甚至可以完全取消空值检查,因为这个查询是针对数据库运行的,你不会得到一个
NullReferenceException
,它可能会工作,但是你必须再次检查。nzk0hqpo2#
这是因为在where子句中有一个空检查。
c9qzyr3d3#
如果将导航集合与空值进行比较,则可能会发生此错误。应检查是否存在任何记录。在特定示例中,无论如何都会使用任何记录,因此检查集合是否为空值是多余的
不正确
正确
hrirmatl4#
在这种情况下,收集字段可以为空,您将获得异常
NullReferenceException
当使用
RelatedTables.Any()
时如果在问题中加上
RelatedTables != null
,则可以得到无法比较类型为"System. Collections. Generic. ICollection" 1 Project1,版本= 1.0.0.0,区域性= neutral,PublicKeyToken = null"的元素。仅支持基元类型、枚举类型与实体类型。
如果出现
NullReferenceException
异常,延迟加载未关闭,并且您擅长于延迟加载字段,则使用virtual
关键字阻止异常标记字段以允许延迟加载字段y3bcpkx15#
我没有配置外键字段,因为
MainTable
和RelatedTable
之间的关系是1对1。但是,对于一对多关系,如果您没有外键,但在RelatedModel
模型中具有MainTable
模型的导航属性,则以下解决方案也有效。1比1
1到多
9fkzdhlc6#
我也有同样的情况,然后通过比较null和FirstOrDefault()通过了,在你的情况下,我是按照下面的方法申请的
kxxlusnw7#
它对我有用,我只是去掉了空校验;
正确:结果=
不正确:结果=