当我想选择仅基于DateTime属性的日期部分的实体时,我发现自己经常使用下面的“模式”而不是经常使用。 EF不会将DateTime.Date属性解析为T-SQL,因此我最终使用此代码:
var nextDay = raceDate.Date.AddDays(1);
return EntityContext.RacingInfoes.SingleOrDefault(ri => ri.RaceDate >= raceDate && ri.RaceDate < nextDay);
这是迄今为止我发现的最易读的解决方案,但我不喜欢在任何地方重复它。但是,我无法将其封装在任何方法中,因为Linq to Entities解析器无法识别该方法。我能做些什么吗?
答案 0 :(得分:1)
您可以通过编写如下方法来封装它:
Expression<Func<T, bool>> OnDate<T>(Expression<Func<T, DateTime>> selector,
DateTime date)
{
var nextDay = date.Date.AddDays(1);
// Build up an expression tree, using Expression.AndAlso etc to
// compare the result of applying the selector with both date and nextDay
}
然后你会写:
return EntityContext.RacingInfoes.SingleOrDefault(Helper.OnDate(x => x.RaceDate),
raceDate);
(OnDate
是一个坏名字,但你明白我的意思......)
答案 1 :(得分:0)
我使用它(通常与LINQKit的Invoke功能结合使用)(类似于Jon Skeet的回答的实现):
public static class Criteria
{
...
public static Expression<Func<DateTime, DateTime, bool>> IsOnDate =
(dateTime, onDate) =>
dateTime >= onDate.Date `&&` dateTime < onDate.AddDays(1).Date;
...
}
这样,您可以在单个语句中将条件与其他条件结合起来
EntityContext.RacingInfoes.AsExpandable().SingleOrDefault(ri =>
Criteria.IsOnDate.Invoke(ri.RaceDate, DateTime.Today) || someOtherCriteria);