2010-09-03 142 views
1

我們有一個DateTime屬性爲DateDestroyed的實體。查詢需要返回結果,其中此值介於可空日期時間startDateendDate之間。爲什麼這個LINQ Where子句不返回結果?

的WHERE子句我有【

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

查詢總是返回任何結果。我很確定我沒有正確編寫這個查詢,但不知道應該如何編寫或爲什麼它不工作?

+0

DO您僅使用的一個得到的結果哪裏? – jjnguy 2010-09-03 04:11:33

+1

您是否在查詢組成後更改'startDate'或'endDate'的值? – 2010-09-03 04:16:49

+0

做任何這些答案幫助你?看起來有一個驅動器downvoter。 – 2010-09-03 22:36:34

回答

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>

+0

@randomDownvoter:謹慎解釋你的downvote,以及這個答案如何解決問題沒有幫助? – 2010-09-03 05:02:46

+0

我得到了同樣的事情p.campbell,我敢肯定我的答案也會起作用。 :( – GONeale 2011-01-05 00:17:49

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子句將正確地解析代碼執行時。

-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); 
+0

測試過這個,但不幸的是不工作 – 2010-09-08 00:36:34

+0

我總是使用這種模式,它應該工作..?你有沒有降級?我不認爲我的建議值得downvote。 – GONeale 2011-01-05 00:19:00

1

我的代碼需要的IQueryable所以我適應在ExtensionMethod.net@p.campbell如下工作:

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; 
} 
相關問題