2011-07-28 9 views
0

DateTime 속성의 날짜 부분에만 기반한 엔티티를 선택하려는 경우 아래에 '패턴'을 사용하는 것이 종종 불안합니다. EF는 T-SQL에 DateTime.Date 속성을 구문 분석하지 않습니다, 그래서 나는이 코드를 사용하게 : 그것은 내가 지금까지 발견 한 가장 읽을 수있는 솔루션입니다EF4의 DateTime 속성에서만 날짜 비교.

var nextDay = raceDate.Date.AddDays(1); 
return EntityContext.RacingInfoes.SingleOrDefault(ri => ri.RaceDate >= raceDate && ri.RaceDate < nextDay); 

을, 그러나 나는 사방을 반복 좋아하지 않는다 . 그러나 Linq to Entities 파서는 해당 메서드를 인식하지 못하기 때문에 어떤 메서드에서도 캡슐화 할 수 없습니다. 이것에 대해 제가 할 수있는 일이 있습니까?

return EntityContext.RacingInfoes.SingleOrDefault(Helper.OnDate(x => x.RaceDate), 
                raceDate); 

(OnDate 나쁜 이름입니다,하지만 당신은 내가 무슨 뜻인지 확인할 수 .. :

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 
} 

그런 다음 당신이 쓰는 것 :

답변

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); 
다른 조건의 기준을 결합 할 수 있습니다