我想问一下如何在Entity Framework中编写一个复杂的DateTime查询,如下所示:
我在服务中使用此代码:
Func<DateTime, DateTime> calculate24HoursLater = (date) =>
{
if (date.DayOfWeek == DayOfWeek.Friday)
return date.AddDays(3);
if (date.DayOfWeek == DayOfWeek.Saturday)
return date.AddDays(3).Date;
if (date.DayOfWeek == DayOfWeek.Sunday)
return date.AddDays(2).Date;
return date.AddDays(1);
};
var unactionedEnquiries =
dataContext.ContactedBrokerEnquiries
.Include("ContactedBrokers")
.Where(
x => x.ContactedBrokers.All(c => c.Status == (byte)LeadStatus.Rejected) ||
x.ContactedBrokers.Any(c => c.Status == (byte)LeadStatus.New && calculate24HoursLater(c.CreatedDate) < DateTime.Now)
).OrderByDescending(c => c.CreatedDate);
结果unactionedEnquiries
,我希望它应该是IQueryable。这意味着SQL服务器在我的下一个语句
然而,我在calculate24HoursLater(c.CreatedDate) < DateTime.Now)
上获得例外
此语句无法转换为SQL语句。我知道原因,但我不知道如何在rule
查询
Entity Framework
重要提示:我不希望将所有数据推入RAM,然后使用该条件进行过滤。理想情况下,它应该在SQL-Server
请告诉我如何在SQL-EF语句中编写它们?
答案 0 :(得分:1)
您可能希望查看可能使用可用于在LINQ查询中执行日期操作的SQLFunctions方法
示例(未经测试)尝试使用以下内容替换您的Func定义:
Func<DateTime, DateTime> calculate24HoursLater = (date) =>
{
if (date.DayOfWeek == DayOfWeek.Friday)
return SqlFunctions.DateAdd("day", 3, date).Value;
if (date.DayOfWeek == DayOfWeek.Saturday)
return SqlFunctions.DateAdd("day", 3, date).Value;
if (date.DayOfWeek == DayOfWeek.Sunday)
return SqlFunctions.DateAdd("day", 2, date).Value;
return SqlFunctions.DateAdd("day", 1, date).Value;
};
答案 1 :(得分:0)
正如我看到here @ andrew的天才回答,你可以这样做:
var calcDate = DateTime.Now.AddHours(-24);
var unactionedEnquiries =
dataContext.ContactedBrokerEnquiries
.Include("ContactedBrokers")
.Where(
x => x.ContactedBrokers.All(c => c.Status == (byte)LeadStatus.Rejected) ||
x.ContactedBrokers.Any(c => c.Status == (byte)LeadStatus.New && c.CreatedDate < calcDate)
).OrderByDescending(c => c.CreatedDate);