正确使用DbFunctions.CreateDateTime()

本文关键字:CreateDateTime DbFunctions | 更新日期: 2023-09-27 18:19:21

我有一个数据库表'DateExcluded'包含3个int列:年,月和日,后者是月的天数。我希望它们的组合在实体查询中进行评估,以便从当前日期检索一年之前的所有行,如下所示:

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?

正确使用DbFunctions.CreateDateTime()

我有一个数据库表'DateExcluded'包含3个int列:年,月和日。

不要为每个year, monthday创建一个列

您正在创建一个不可搜索的查询,也被认为是您可以创建的性能最差的查询。

正确的方法是实际使用DateTime字段。那么你的查询是正确的,没有任何错误的数学可能。

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

如果您仍然想使用DbFunctions。CreateDateTime,避免空值,因为它不会正确工作(参见Ole EH Dufour评论中的原因)。你应该传递0而不是null,像这样:

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