.net 正确使用数据库函数,CreateDateTime()

kmbjn2e3  于 2023-02-01  发布在  .NET
关注(0)|答案(2)|浏览(136)

我有一个数据库表'DateExcluded'包含3整数列:年、月和日,后者是月份的第几天。我希望在实体查询中计算它们的组合,以检索从当前日期开始一年之前的所有行,如下所示:

var l = 
    (from p in c.DateExcluded 
     where
        DbFunctions.CreateDateTime(p.Year, p.Month, p.Day, null, null, null)
        <= DateTime.Now.AddYears(1)
     select p).ToList();

此查询始终返回0列,但它不应该返回。DbFunctions的使用错误。CreateDateTime?

8dtrkrch

8dtrkrch1#

我有一个数据库表'DateExcluded'包含3整数列:年、月、日。
永远不要为每个yearmonthday创建列
您正在创建一个non-sargable查询,也就是您所能创建的性能最差的查询。
正确的方法是实际使用DateTime字段,这样您的查询就正确了,不会出现任何不正确的数学运算。

var l = 
(from p in c.DateExcluded 
 where
    c.DateExcluded < DateTime.Now.AddYears(1).AddDay(1)
 select p)
.ToList();
jdgnovmf

jdgnovmf2#

如果你仍然想使用DbFunctions.CreateDateTime,避免空值,因为它不能正常工作(参见Ole EH Dufour的注解中的原因)。你应该传递0而不是空值,如下所示:

DbFunctions.CreateDateTime(p.Year, p.Month, p.Day, 0, 0, 0)

相关问题