[英]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.