如何在实体框架中使用DateTime.AddDays(x)

问题描述 投票:0回答:3

我有这个代码:

from pr in e.ProgramSetup.Include("Program").Include("Program.Client")
        where pr.DateBegin < DateTime.Now
        && pr.DateEnd > DateTime.Now.AddDays(pr.DateEndOffset) 
select pr).ToList();

它不起作用,因为 AddDays() 无法用于生成 sql。

那么还有其他方法吗?现在我选择所有内容并最终通过 foreach 过滤它,但在我看来这不是好方法。

问题是 pr.DateEndOffset 也只在 db 中,它不是常量...

c# entity-framework datetime linq-to-entities
3个回答
23
投票
using System.Data.Entity;
...
DbFunctions.AddDays(dateFromDataStore, numDaysToAdd);

10
投票

您需要使用映射到规范函数的 EntityFunction 之一。以下是 AddDays 的示例:

public class MyEntity
{
    public int Id { get; set; }
    public DateTime Date { get; set; }
}

public class MyContext : DbContext
{
    public DbSet<MyEntity> Entities { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        using (var ctx = new MyContext())
        {
            if (!ctx.Entities.Any())
            {
                ctx.Entities.Add(new MyEntity() { Date = new DateTime(2000, 1, 1) });
                ctx.Entities.Add(new MyEntity() { Date = new DateTime(2012, 10, 1) });
                ctx.Entities.Add(new MyEntity() { Date = new DateTime(2012, 12, 12) });
                ctx.SaveChanges();
            }

            var q = from e in ctx.Entities
                    where e.Date > EntityFunctions.AddDays(new DateTime(2012, 10, 1), 10)
                    select e;

            foreach (var entity in q)
            {
                Console.WriteLine("{0} {1}", entity.Id, entity.Date);
            }
        }
    }
}

0
投票

对于 MySQL,您还需要为正在查询的数据库创建一个函数:

创建函数 AddDays(dateValue DateTime, days INT) 返回日期 确定性 返回 AddDate(日期值, 天);

SQL Server 自动路由到内部 DATE_ADD 函数。

© www.soinside.com 2019 - 2024. All rights reserved.