实体框架中的复杂DateTime查询

时间:2015-01-07 08:31:54

标签: sql sql-server entity-framework datetime

我想问一下如何在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语句中编写它们?

2 个答案:

答案 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);