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