2010-08-02 3 views
2

않습니다사용자 정의 기능은 때때로 때때로 제대로 번역 나는이 기능하지

public static IQueryable<Article> WhereArticleIsLive(this IQueryable<Article> q) 
{ 
    return q.Where(x => 
     x != null 
     && DateTime.UtcNow >= x.PublishTime 
     && x.IsPublished 
     && !x.IsDeleted); 
} 

를 그리고이 쿼리에서 잘 작동합니다 :

from a in Articles.WhereArticleIsLive() 
where a.Id == 5 
select new { a.Title } 

그러나 그렇지 않습니다 이 약간 더 복잡한 쿼리에서 작동 :

from s in Series 
from a in Articles.WhereArticleIsLive() 
where s.Id == a.SeriesId 
select new { s, a } 

를이 오류 메시지가 :

에서 NotSupportedException : 엔티티 LINQ 메소드 'System.Linq.IQueryable 1[TheFraser.Data.Articles.Article] WhereArticleIsLive(System.Linq.IQueryable 1 TheFraser.Data.Articles.Article])'방식을 인식하지 않고,이 방법은 저장 식으로 변환 될 수 없다.

왜 그런가? 이와 같은 쿼리 매개 변수를 통합하는 또 다른 방법이 있습니까?

미리 감사드립니다.

답변

3

편집 : Craig의 수정.

나는이 도구를 유용한 도구라고 생각하기 때문에 여기에 남겨두고 있습니다. linqkit을 사용하십시오! 하지만이 문제를 해결할 수는 없습니다 :-)

IQueryable을 반환하는 대신 Expression을 사용하여 조건부를 제외합니다. 예 :

var isLive = Article.IsLive(); 

from s in Series 
from a in Articles.Where(isLive) 
where s.Id == a.SeriesId 
select new { s, a } 
+1

이것은 : (테스트하지)의 라인을 따라 뭔가를 쿼리를 만들 때이 표현에 대한 참조를 저장할 수 있도록, 그리고

public static Expression<Func<Article,bool>> IsLive() { return x => x != null && DateTime.UtcNow >= x.PublishTime && x.IsPublished && !x.IsDeleted } 

: 당신은 기사에서 다음 정적 메소드를 정의 할 수 있습니다 거의 오른쪽. (1)'표현식'은 올바른 방법입니다. (2) 당신은 LINQKit (다른 것들에 아주 좋습니다)을이 작업이나'Compile '등을 위해서 필요로하지 않습니다. (3) 키는 표현식에 대한 참조를 저장하는 것입니다 :'Expression > isLive = Article.IsLive(); (isLive)' –

+0

@Craig Stuntz : 피드백에 대한 감사, 그에 따라 내 대답을 업데이트했습니다. – jeroenh

+0

아, 그게 바로 Expression입니다. Linqkit도 주셔서 감사합니다. 편리 할 것으로 확신합니다. –

관련 문제