我有一些过滤器类。这个类有可以为空的日期字段。
public class Filter
{
DateTime? date;
}
然后我有一些LINQ查询,它使用nHibernate的IQueryable对象。在我有一个条件:
Where(x=>...
some expression
&& !Model.date.HasValue ? true : (x.fooDate.Date == Model.date.Value.Date)
&& some expresion
不幸的是它会抛出异常(即PartialEvaluationExceptionExpression)。当Model.date.Value不存在时,它可能会尝试评估表达式的错误路径。
我该如何处理?我知道我可以这样做:
if(!Model.Date.HasValue)
{
Where(x=>...
some expression
//Mentioned condition is omitted
&& some expression
}
else
{
Where(x=>...
some expression
&& (x.fooDate.Date == Model.date.Value.Date)
&& some expresion
}
答案 0 :(得分:1)
我决定通过如下划分查询来省略问题:
query = Where(x=>...
some expression
&& some expresion
&& some expresion
&& some expresion);
if(Model.date.HasValue)
{
query = query.Where(x=>...
x.fooDate.Date == Model.date.Value.Date);
}
答案 1 :(得分:0)
那么,为什么不把它写成:
Where(x=>...
!Model.date.HasValue ?
true :
(Model.date.Value != null
&& x.fooDate.Date == Model.date.Value.Date)
<强>更新强>
更准确地看这个表达式 - 我不认为Model.date.Value
在表达式的第二个分支中可以为null。更有可能是x.fooDate
,所以第二个分支看起来应该是这样的:
(x.fooDate != null && x.fooDate.Date == Model.date.Value.Date)
答案 2 :(得分:0)
我将它分成一个或:
Where(x=>...
(Model.date == null || x.fooDate.Date == Model.date.Value.Date)
我不确定HasValue是否有效,而且我没有一种简单的测试方法,因此我将其更改为空检查。