[英]Comparing dates in query using LINQ
我有一個返回 var 類型 myQry 的 Linq 查詢
var myQry = from .....
這是一個很大的 linq 返回我需要進一步過濾的所有記錄。 在我的一個 if 條件中,我有一個像這樣運行的過濾器來檢查日期。 我需要檢查名稱是否包含輸入的名稱並與出生日期完全匹配。
我試過這個編譯並運行的,但沒有正常工作
myQry.Where(x => x.FirstName.Contains(strName) && DateTime.Compare( x.BirthDt, searchDt)>=0).ToList()
然后我嘗試了這個,它拋出了一個異常“DbArithmeticExpression arguments 必須有一個數字通用類型”
myQry.Where(x => x.FirstName.Contains(strName) && (x.BirthDt- searchDt).Days == 0).ToList();
對於這種情況,當我在查詢中使用 where 子句時,進行日期比較的最佳方法是什么? LinQ 查詢的 where 子句中不允許進行哪些操作?
謝謝你的時間...
在這種情況下,您可能希望使用 SQL 服務器特定功能,使用SqlMethods class 中的方法。
您的第二個查詢可以重寫為
myQry.Where(x => x.FirstName.Contains(strName) &&
SqlMethods.DateDiffDay(x.BirthDt, searchDt) == 0).ToList()
這將被翻譯成類似的東西
SELECT ... FROM Table WHERE FirstName
LIKE '@p0' AND DATEDIFF(Day, BirthDt, @p1) = @p2
其中 p0、p1 和 p2 是參數。
試試這個:
myQry.Where(x => x.FirstName.Contains(strName) &&
x.BirthDt.Date == searchDt.Date).ToList()
請注意,要使上述工作正常, BirthDt
和searchDt
都必須是有效的 DateTime 值。 您現在只比較 DateTime 值的 Date 部分,丟棄了 Time 部分。
支持什么操作取決於ORM框架,(Nhibernate,EF等),但基本上你可以考慮如果你使用的方法沒有直譯為SQL很可能是不支持的。
這就是為什么支持運算符==
但不支持DateTime.Compare
方法,或者運算符-
in DateTime
不受支持,因為它沒有明確的翻譯。
始終嘗試堅持使用最簡單的運算符並避免使用方法,如果仍然失敗,如果您的 ORM 支持該特定方法,您將不得不谷歌一下。
我同意 Leniel Macaferi 關於更新 Where 子句和比較日期而不是日期時間的觀點。 對於生日,通常與出生時間無關。 回答你的第二個問題
LinQ 查詢的 where 子句中不允許進行哪些操作?
Where()
是一種適用於IEnumerable<T>
或IQueryable<T>
的擴展方法。 我們可以通過Where
查看源代碼的位置按 F12 來看到這一點:
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);
支持的操作稱為謂詞。 謂詞是一個委托,它接受一個 TSource 類型的參數並返回一個布爾值,告訴我們條件是否匹配。 這可以在上面的代碼中的第二個參數中看到: Func<TSource, bool> predicate
您可以將謂詞定義為任何您想要的。 只要它返回一個 bool 並接受 1 個 TSource 類型的參數。
這通常是通過定義一個 lambda 表達式來實現的,Leniel Macaferi 就是這樣做的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.