什么是PartialEvaluationExceptionExpression,如何修复?

9

我有一些使用nHibernate的LINQ查询代码,当它执行时会抛出PartialEvaluationExceptionExpression异常。这到底是什么意思,我该怎么办?

SomeIqueryableNhibernateObject
.Where(x=>...
some expression
&& !Model.date.HasValue ? true : (x.fooDate.Date == Model.date.Value.Date)
&& some expresion

模型(Model)是什么:

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

它仍然抛出异常。


你是否查阅了 PartialEvaluationExceptionExpression 的文档以了解该异常的含义? - Servy
我很惊讶,但是我找不到关于那个异常的清晰信息。例如这个链接:http://www.nudoq.org/#!/Packages/NHibernate/NHibernate/PartialEvaluationExceptionExpression - 我认为它没有提供任何有用的信息。 - Arkadiusz Kałkus
对我来说,第一个谷歌搜索结果是:http://www.nudoq.org/#!/Packages/Remotion.Linq/Remotion.Linq/PartialEvaluationExceptionExpression - Servy
2个回答

10

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

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

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

这里的查询提供程序只在需要评估值时才给出要评估的值。


1
你写的最重要的部分是关于将LINQ表达式转换为SQL的部分。我一直在过度思考“命令式”,所以当条件为真时,我很惊讶为什么会执行错误的路径。老实说,我之前已经用你写的方法解决了这个问题,但我仍然不知道为什么它不起作用。现在我明白了原因。非常感谢你。 - Arkadiusz Kałkus

0
这也可能发生在数据库中日期/时间值超出范围的情况下。(System.DateTime初始化为默认值就是一个很好的例子。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接