Сравнение даты только для свойств DateTime в EF4. - PullRequest
0 голосов
/ 28 июля 2011

Я часто использую приведенный ниже «шаблон» довольно тревожно, когда хочу выбрать объекты, основанные только на части даты свойства 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 ]

1 голос
/ 28 июля 2011

Вы можете инкапсулировать его, написав такой метод:

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 это плохое имя, но вы понимаете, что я имею в виду ...)

0 голосов
/ 28 июля 2011

Я использую это (часто в сочетании с LINQKit функциональностью Invoke) (что аналогично реализации ответа Джона Скита):

    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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...