C# 什么是PartialEvaluationExceptionExpression,如何修复它?
我有一些使用nHibernate的LINQ查询代码,当它执行时,会抛出PartialEvaluationExceptionExpression。这到底意味着什么?我能做些什么C# 什么是PartialEvaluationExceptionExpression,如何修复它?,c#,linq,nhibernate,C#,Linq,Nhibernate,我有一些使用nHibernate的LINQ查询代码,当它执行时,会抛出PartialEvaluationExceptionExpression。这到底意味着什么?我能做些什么 SomeIqueryableNhibernateObject .Where(x=>... some expression && !Model.date.HasValue ? true : (x.fooDate.Date == Model.date.Value.Date) && some
SomeIqueryableNhibernateObject
.Where(x=>...
some expression
&& !Model.date.HasValue ? true : (x.fooDate.Date == Model.date.Value.Date)
&& some expresion
其中模型为:
public class Filter
{
DateTime? date;
}
异常是由三元运算符的错误路径引起的:
x.fooDate.Date == Model.date.Value.Date
即使我将其修改为:
x.fooDate != null && Model.date.HasValue && x.fooDate.Date == Model.date.Value.Date
它仍然会抛出异常。您运行的代码获得了
null
对象的值,因此它会抛出异常。当查询提供程序试图将该查询转换为数据库可以执行的内容时,它需要将Model.date.Value.date
解析为其值,以便在查询中使用该值。由于没有值,代码将中断
当然,解决方案是不要将这样的检查内联到查询本身中。在查询上下文之外,确定是否应添加此检查,然后仅在需要时添加它:
var query = CreateInitialQuery();
if(Model.date.HasValue)
query = query.Where(x => x.fooDate.Date == Model.date.Value.Date);
在这里,只有当实际有一个值需要计算时,才会给查询提供程序一个值进行计算。如果日期/时间值超出数据库的范围,也会发生这种情况。(初始化为默认值的System.DateTime就是一个很好的例子。)您是否查阅了
PartialEvaluationExceptionExpression
的文档,以了解该异常的含义?我很惊讶,但找不到关于该异常的任何明确信息。例如:-在我看来,它没有提供任何有用的信息。对我来说,谷歌的第一个结果是:你写的最重要的事情是关于将LINQ表达式翻译成SQL的部分。我想了太多的“命令”,所以我很惊讶,如果条件为真,为什么会执行错误路径。老实说,我以前也用同样的方法解决过这个问题,就像你写的那样提取它,但我仍然不知道为什么它不起作用。现在我明白了原因。非常感谢你。