繁体   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