我正在尝试使用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'
我发现这些问题是通过实体框架方法来解决这个问题,以转换日期类型并进行比较
但是这些解决方案使用存储在数据命名空间中的EF方法,我在服务命名空间查询,我不应该在服务层中调用存储库函数, 对?那我怎么能这样做呢?
答案 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