仅比较EF4中的DateTime属性的日期。

时间:2011-07-28 16:22:17

标签: linq entity-framework linq-to-entities

当我想选择仅基于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解析器无法识别该方法。我能做些什么吗?

2 个答案:

答案 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);