【问题标题】:Complex DateTime query in Entity Framework实体框架中的复杂日期时间查询
【发布时间】:2015-01-07 08:31:53
【问题描述】:

请问如何在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 Server 在我的下一条语句之前不会执行

但是,我在calculate24HoursLater(c.CreatedDate) &lt; DateTime.Now) 上遇到异常情况@ 该语句不能转换为 SQL 语句。我知道原因,但我不知道如何在Entity Framework 查询中写出rule

重要提示:我不喜欢将所有数据推入 RAM,然后使用该条件进行过滤。理想情况下,它应该在SQL-Server

能否请您告诉我如何在 SQL-EF 语句中编写它们?

【问题讨论】:

    标签: sql sql-server entity-framework datetime


    【解决方案1】:

    您可能想看看可能使用SQLFunctions 可用于在 LINQ 查询中进行日期操作的方法

    示例(未经测试)尝试将您的 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;
    };
    

    【讨论】:

    • SQLFunctions 与 LINQ to EF 一起使用,不知道为什么投反对票??
    • 是的,但你的 Func 没有。
    【解决方案2】:

    正如我看到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);
    

    【讨论】:

    • 这真是个天才的答案,太棒了^_^
    • 好吧,在这段代码中,我看不出如何使用取决于天数的参考日期。
    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    相关资源
    最近更新 更多