[英]Using Where clause for DateTime field using a LINQ statement
我正在嘗試根據用戶的電話號碼以及對PolicyEnd
字段(日期時間格式)的限制來返回記錄,以僅返回大於或等於 2022 的記錄。但是,我不斷遇到幾個錯誤:
&& 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 服務器具有date
、 datetime2
、 datetimeoffset
、 time
和用於存儲日期和時間的舊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.