在Linq中向实体添加日期

Cra*_*ste 8 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
Run Code Online (Sandbox Code Playgroud)

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

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

干杯

Cra*_*ntz 11

您可以AddHours使用EntityFunctions 该类生成一个.

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

但是,WHERE除非列上有表达式索引,否则不要指望使用索引对其进行优化.


Osw*_*rez 5

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();
            }
        }
Run Code Online (Sandbox Code Playgroud)