C# 什么是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

我有一些使用nHibernate的LINQ查询代码,当它执行时,会抛出PartialEvaluationExceptionExpression。这到底意味着什么?我能做些什么

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的部分。我想了太多的“命令”,所以我很惊讶,如果条件为真,为什么会执行错误路径。老实说,我以前也用同样的方法解决过这个问题,就像你写的那样提取它,但我仍然不知道为什么它不起作用。现在我明白了原因。非常感谢你。