簡體   English   中英

使用 LINQ 語句對 DateTime 字段使用 Where 子句

[英]Using Where clause for DateTime field using a LINQ statement

我正在嘗試根據用戶的電話號碼以及對PolicyEnd字段(日期時間格式)的限制來返回記錄,以僅返回大於或等於 2022 的記錄。但是,我不斷遇到幾個錯誤:

  1. && DateTime.ParseExact(s: ti0.Outer.Inner.PolicyEnd,format: "yyy-MM-dd",provider: __InvariantCulture_0) > DateTime.Now)' 無法翻譯。

     var QUERY = from client in _ipacontext.Inclients join policy in _ipacontext.Inpolicies on client.ClientId equals policy.AccountNo join types in _ipacontext.InpolicyTypes on policy.PolicyType equals types.TypeId where client.Telephone2 == "0000000" && DateTime.ParseExact(policy.PolicyEnd, "yyy-MM-dd", CultureInfo.InvariantCulture) > 2022

我也在下面嘗試過,但徒勞無功:

where client.Telephone2 == "000000"  &&  Convert.ToDateTime(policy.PolicyEnd).Year >=2022

日期格式示例如下:

2022-08-31 00:00:00.000

對其他解決方法有任何幫助嗎?

日期沒有格式,它們在所有數據庫中都是二進制類型(SQLite 除外)。 SQL 服務器具有datedatetime2datetimeoffsettime和用於存儲日期和時間的舊datetime 將日期作為字符串存儲在字符串字段中是一個必須修復的嚴重錯誤。 沒有辦法控制進入字符串字段的內容,這意味着垃圾或格式錯誤的字符串很容易進入數據庫。

即使使用索引,嘗試解析此類字符串也會導致性能下降並增加阻塞。 索引是使用存儲的值構建的,而不是 function 結果。 嘗試解析PolicyEnd並按特定日期過濾將不得不掃描整個表,解析值,然后才決定要包含哪些值。 這樣做時,它將在整個表上使用共享鎖,這將阻止任何嘗試同時運行的 UPDATE 或 DELETE 調用,即使它們超出了日期范圍。

如果該字段使用日期類型,則PolicyEnd屬性應該是DateTime 在那種情況下,過濾以查找 2022 年之后的所有日期將只是:

var fromDate=new DateTime(2023,1,1);

var query = ....
            where client.Telephone2 == "000000"  
                  && policy.PolicyEnd >=fromDate

這將產生一個參數化查詢,該查詢可以使用任何涵蓋PolicyEnd的索引來僅觸及PolicyEnd值與條件匹配的策略行。

JOIN 也不是必需的。 從實體之間的關系生成 JOIN 是 EF 的工作。 Client應該有一個Policies集合。 一個Policy應該有一個PolicyType 一個 LINQ 查詢返回沒有第二部電話的客戶,其政策在未來結束應該是:

var clients=from client in _context.Clients
            from policy in client.Policies
            where client.Telephone2 == "000000"  
                  && policy.PolicyEnd >=fromDate
            select ...;

由於您的數據庫表列格式日期時間,只需嘗試使用 function

var dt = new DateTime(2022,01,01);
....

 &&    EF.Functions.DateDiffYear(policy.PolicyEnd, dt) >= 0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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