簡體   English   中英

使用 LINQ 比較查詢中的日期

[英]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()

請注意,要使上述工作正常, BirthDtsearchDt都必須是有效的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM