2015-02-06 170 views
7

我有一些使用nHibernate进行LINQ查询的代码,当它执行时,它会抛出PartialEvaluationExceptionExpression。这意味着什么,我能做些什么呢?什么是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 

它仍然引发异常。

+0

您是否查找了“PartialEvaluationExceptionExpression'的文档来查看它说什么异常的含义? – Servy 2015-02-06 21:47:20

+0

我很惊讶,但我找不到有关该例外的任何明确信息。例如:http://www.nudoq.org/#!/Packages/NHibernate/NHibernate/PartialEvaluationExceptionExpression - 在我看来,它没有提供任何有用的信息。 – Landeeyo 2015-02-06 21:49:47

+0

对我来说,第一个谷歌搜索结果是这样的:http://www.nudoq.org/#!/Packages/Remotion.Linq/Remotion.Linq/PartialEvaluationExceptionExpression – Servy 2015-02-06 21:51:04

回答

7

您正在运行的代码获取的是对象的值,因此其投掷。当查询提供程序试图将该查询翻译成数据库可执行的内容时,它需要将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。我在想太多的“必要的”,所以我很惊讶为什么假如条件成立就会执行错误的路径。说实话,我之前用相同的方式解决了这个问题,就像你写的那样解压,但我仍然不知道为什么它不起作用。现在我明白了原因。非常感谢你。 – Landeeyo 2015-02-06 22:05:53

相关问题