2010-05-27 5 views
2

Revision (Nullable 포함) DateEffectiveFromDateEffectiveTo이라는 Entity Framework 4.0 엔터티 개체가 있습니다. 쿼리의 짧은 손 방법이 있다면 궁금 해서요 대신 다음 쿼리 구조를 사용하지의 특정 QueryDate 날짜를 기준으로 객체의 RevisionHistory 다음에 다음 부울 함수를 만드는Entity Framework 사용자 지정 쿼리 함수

var results = EntityObject.Revisions.Where(x => 
    (x.DateEffectiveFrom == null && x.DateEffectiveTo == null) || 
    (x.DateEffectiveFrom == null && x.DateEffectiveTo >= QueryDate) || 
    (x.DateEffectiveFrom <= QueryDate && x.DateEffectiveTo == null) || 
    (x.DateEffectiveFrom <= QueryDate && x.DateEffectiveTo >= QueryDate)); 

내가 해봤를 Revision 클래스 :

partial class Revision 
{ 
    public bool IsEffectiveOn(DateTime date) 
    { 
     return (x.DateEffectiveFrom == null && x.DateEffectiveTo == null) || 
      (x.DateEffectiveFrom == null && x.DateEffectiveTo >= date) || 
      (x.DateEffectiveFrom <= date && x.DateEffectiveTo == null) || 
      (x.DateEffectiveFrom <= date && x.DateEffectiveTo >= date)); 
    } 
    ... 
} 

그리고 다음에 쿼리 업데이트 :

var results = EntityObject.Revisions.Where(x => x.IsEffectiveOn(QueryDate)); 

하지만 분명히 D를 SQL로 변환 할 필요가 없습니다. 어떤 아이디어라도 높이 평가할 수 있습니다.

답변

1

Predicate Builder을 시도해보고 적절한 SQL로 변환되는지 확인할 수 있습니다.

+0

고마워 Robert -이 질문 (예 : DataContext.Revisions)에 대한 Ikeerable 쿼리의 트릭을 수행하는 것 같았습니다. IEnumerable 시나리오에 대한 아이디어. PS - 아티클에서 조건 자 사용에 대한 자세한 설명도 감사하게 생각합니다. – Josh

+0

IEnumerable 시나리오의 경우 [Dynamic Linq] (http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic- query-library.aspx)가 작동합니다. Dynamic Linq는 강력한 형식이 아니라 ... 당신은 당신의 술어를 문자열로 구성해야합니다. –

0

이 쿼리를 작성하는 방법은 부분적으로 EffectiveFrom 및 EffectiveTo에 대해 NULL이 무엇인지에 달려 있습니다.

EffectiveFrom이 NULL이면 EffectiveTo 이전의 모든 날짜에 유효하고 NULL의 역순으로 유효해야합니까? 이 경우 NULL EffectiveFrom 값 대신 DateTime.MinValue을 사용하고 EffectiveTo에는 DateTime.MaxValue을 사용할 수 있습니다. 그 시점에서 당신은 단순히 BETWEEN 스타일 쿼리를 사용할 수 있습니다

Where(x => x.DateEffectiveFrom > QueryDate < x.DateEffectiveTo); 
당신은 당신의 함수가 아니라 부울보다 Expression를 반환 할 수 있습니다
+0

Dave의 답변에 감사 드리며 가능한 경우이 상황을 피하려고합니다. – Josh

3

:

partial class Revision 
{ 
    public static Expression<Func<Revision, bool>> IsEffectiveOn(DateTime date) 
    { 
     return x => (x.DateEffectiveFrom == null && x.DateEffectiveTo == null) || 
      (x.DateEffectiveFrom == null && x.DateEffectiveTo >= date) || 
      (x.DateEffectiveFrom <= date && x.DateEffectiveTo == null) || 
      (x.DateEffectiveFrom <= date && x.DateEffectiveTo >= date)); 
    } 
} 

그런 다음 당신이 그것을 사용할 수 있습니다

var predicate = Revision.IsEffectiveOn(DateTime.Now); 
var results = EntityObject.Revisions.Where(predicate); 

... 그리고 그것은 SQL로 변환됩니다.

+0

감사합니다. Craig - 내가 언급 한 기사가 위에 제시된 해결책을 지적하면서 Robert에게 대답했습니다. 내가 코드를 고맙게 생각하기 때문에 내가 할 수 있으면 당신의 응답도 올리겠다. – Josh

+0

@ Josh : 나는 당신을 위해 그것을 부딪쳤다. –

+0

@ 로버트 : 고마워 ... 초보자가되는 기쁨 : P – Josh

관련 문제