如何将Entity Framework中的日期与存储库模式进行比较

时间:2014-02-18 15:35:21

标签: c# linq entity-framework

我正在尝试使用Repository模式在Entity Framework中执行查询:

命名空间:服务

List<Data.Item> itemToday = repositoryUser.Get(i => i.UserId.Equals(user.Id) &&
                                               i.Created.Date < DateTime.Now.Date)
                                          .ToList();

命名空间:数据(我的存储库)

public IEnumerable<T> Get(System.Linq.Expressions.Expression<Func<T, bool>> expressionFilter)
{
    return this.dbContext.Set<T>().Where(expressionFilter);
}

这将抛出此错误:

  

LINQ to Entities

中不支持指定的类型成员'Date'

我发现这些问题是通过实体框架方法来解决这个问题,以转换日期类型并进行比较

  1. Compare Date values in Entity Framework
  2. Compare Dates using LINQ to Entities (Entity Framework)
  3. 但是这些解决方案使用存储在数据命名空间中的EF方法,我在服务命名空间查询,我不应该在服务层中调用存储库函数, 对?那我怎么能这样做呢?

1 个答案:

答案 0 :(得分:0)

由于你将地方向下传递给EF,你需要以EF方式(见下文)。否则你将不得不解析查询本身并将正确的一个发送到EF,这不是很容易。我可能会编写一个方法,其中包含特定方案所需的参数:

public List<Data.Item> Get<T>(int id, DateTime createdBeforeDate)
{
     return this.dbContext.Set<T>().Where(i => i.UserId.Equals(id) &&
                                               SqlFunctions.DateDiff("DAY", i.Created, createdBeforeDate) > 0))
                                   .ToList();
}

您可以将SqlFunctions类用于这些场景。您可以使用参数“DAY”的SqlFunctions.DateDiff函数(我在这里找到答案:https://stackoverflow.com/a/14778874/455904)。

在您的情况下,我相信SqlFunctions.DateDiff("DAY", i.Created, DateTime.Now) > 0)应该有效

List<Data.Item> itemToday = repositoryUser.Get(i => i.UserId.Equals(user.Id) &&
                                               SqlFunctions.DateDiff("DAY", i.Created, DateTime.Now) > 0))
                                          .ToList();

可以使用旁注DateTime.Today代替DateTime.Now.Date