我们有一个DateTime属性为DateDestroyed
的实体。查询需要返回结果,此值介于可以为空的DateTimes startDate
和endDate
之间。
我所在的where子句是:
.Where(x => startDate.HasValue ? startDate <= x.DateDestroyed : true)
.Where(x => endDate.HasValue ? x.DateDestroyed <= endDate : true);
查询始终不返回任何结果。我很确定我没有正确编写这个查询,但不知道应该如何编写或为什么它不起作用?
答案 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);