在Linq中向实体添加日期

时间:2010-11-03 14:42:44

标签: entity-framework

使用Linq to Entities,我正在尝试查询Log表以查找匹配行附近的行。我在查询中添加日期时遇到问题。这是我到目前为止所做的。

from
    l in objectSet.Logs
let
    match = objectSet.Logs.Where(whatever).FirstOrDefault()
where
       l.Timestamp > (match.Timestamp - twoHours)
    && l.Timestamp < (match.Timestamp + twoHours)
select
    l

离开找到我感兴趣的行的“无论”条件,“twoHours”可变时间跨度,.AddHours()函数等等。我没有找到EF可以生成SQL的正确方法,该方法将字段(match.Timestamp)中的值添加到常量。

显而易见的解决方案是首先执行“匹配”查询,然后在第二个查询中使用文字值,但我已将此处的代码示例简化为主要问题(在查询中添加日期),实际上我的查询更复杂,这不太理想。

干杯

3 个答案:

答案 0 :(得分:11)

您可以使用AddHours class生成EntityFunctions

from
    l in objectSet.Logs
let
    match = objectSet.Logs.Where(whatever).FirstOrDefault()
where
       (l.Timestamp > EntityFunctions.AddHours(match.Timestamp, -1 * twoHours))
    && // ...
select
    l

但是,除非您在列上有表达式索引,否则不要指望使用索引优化此WHERE

答案 1 :(得分:3)

EntityFunctions已弃用,取而代之的是DbFunctions

public int GetNumUsersByDay(DateTime Date)
        {
            using (var context = db)
            {
                var DateDay = new DateTime(Date.Year, Date.Month, Date.Day);
                var DateDayTomorrow = DateDay.AddDays(1);
                return context.Users.Where(m => DbFunctions.AddHours(m.DateCreated,-5) >= DateDay && m.DateCreated < DateDayTomorrow).Count();
            }
        }

答案 2 :(得分:-1)

正如本文所述 - http://www.devart.com/blogs/dotconnect/?p=2982#first,在查询中使用参数(声明变量)代替DateTime。