什么是部分评估ExceptionExpression以及如何解决?

时间:2015-02-06 21:43:52

标签: c# linq nhibernate

我有一些使用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

它仍然会抛出异常。

2 个答案:

答案 0 :(得分:9)

您正在运行的代码正在获取null对象的值,因此它正在抛出。当查询提供程序尝试将该查询转换为数据库可以执行的内容时,需要将Model.date.Value.Date解析为其值,以便可以在查询中使用该值。由于没有值,代码会中断。

解决方案当然是不要将这样的检查内联到查询本身。在查询的上下文之外确定是否应该添加此检查,然后仅在需要时添加它:

var query = CreateInitialQuery();
if(Model.date.HasValue)
    query = query.Where(x => x.fooDate.Date == Model.date.Value.Date);

这里只为查询提供程序提供值,以便在实际存在要评估的值时进行评估。

答案 1 :(得分:0)

如果“日期/时间”值超出数据库范围,也会发生这种情况。 (将System.DateTime初始化为默认值就是一个很好的例子。)