为什么这个LINQ Where子句没有返回结果?

时间:2010-09-03 03:59:04

标签: linq linq-to-objects

我们有一个DateTime属性为DateDestroyed的实体。查询需要返回结果,此值介于可以为空的DateTimes startDateendDate之间。

我所在的where子句是:

.Where(x => startDate.HasValue ? startDate <= x.DateDestroyed : true)
.Where(x => endDate.HasValue ? x.DateDestroyed <= endDate : true);

查询始终不返回任何结果。我很确定我没有正确编写这个查询,但不知道应该如何编写或为什么它不起作用?

4 个答案:

答案 0 :(得分:1)

我的代码需要IQueryable,所以我在@p.campbell ExtensionMethod.net调整了工作,如下所示:

public static IQueryable<TSource> WhereIf<TSource>(this IQueryable<TSource> source, bool condition, Func<TSource, bool> predicate)
{
    return condition ? source.Where(predicate).AsQueryable() : source;
}

public static IQueryable<TSource> WhereIf<TSource>(this IQueryable<TSource> source, bool condition, Func<TSource, int, bool> predicate)
{
    return condition ? source.Where(predicate).AsQueryable() : source;
}

答案 1 :(得分:0)

假设您有一个名为“query”的变量,您已经存储了linq语句的开头部分。试试这个动态构造where子句:

if (startDate.HasValue) {
    query = query.Where(x => x.DateDestroyed >= startDate);
}
if (endDate.HasValue) {
    query = query.Where(x => x.DateDestroyed <= endDate);
}

LINQ适用于延迟执行,因此WHERE子句将在代码执行时正确解析。

答案 2 :(得分:0)

您可以为WhereIf创建/使用扩展方法:

给定布尔条件,附加Where子句。

 var foo = db.Customers.WhereIf(startDate.HasValue, 
                                   x => startDate <= x.DateDestroyed)
                       .WhereIf(endDate.HasValue,  
                                   x => x.DateDestroyed <= endDate );

WhereIf at ExtensionMethod.net的更多详情。您可以在那里找到IEnumerable<T>IQueryable<T>的代码。

答案 3 :(得分:-1)

您是否始终使用Where()过滤器重新分配查询?

此模式应按预期工作:

var query = getResults();
query = query.Where(x => startDate.HasValue ? startDate <= x.DateDestroyed : true)
query = query.Where(x => endDate.HasValue ? x.DateDestroyed <= endDate : true);