用于句柄可为空的DateTime的LINQ查询中的三元运算符抛出异常

时间:2015-02-06 13:12:55

标签: c# linq nhibernate

我有一些过滤器类。这个类有可以为空的日期字段。

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 
}

3 个答案:

答案 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是否有效,而且我没有一种简单的测试方法,因此我将其更改为空检查。