2011-02-17 4 views
1

는 EF4 다음과 같은 모델을 가정 할 수 있습니다 :계획 EF4는

class Order 
{ 
    .... 
    public int Id {get;private set;} 

    //ICollection is the root of all evil here 
    public ICollection<OrderDetail> Details {get;private set;} 
} 

을 내가 할 수있는 다음 Linq에이 구조를 통해 프로젝트 :

var IdAndCount = context 
    .Orders 
    .Select (o => new { 
      Id = o.Id, 
      Count = o.Details.Where(d => d.Foo > 0).Count()}); 

지금까지 너무 좋아,이 완벽하게 될 것입니다 SQL로 변환되었습니다. 나는이 쿼리의 where 절 술어를 추출 할 경우 어떤 문제에 이제

:

Func<OrderDetail,bool> detailPredicate = d => d.Foo > 0; 

var IdAndCount = context 
    .Orders 
    .Select (o => new { 
     Id = o.Id, 
     Count = o.Details 
        .Where(detailPredicate) 
        .Count()}); 

이 컴파일하지만 SQL의 술어를 번역하는 EF4에 대한 방법이 없기 때문에 런타임에 실패 표현식이 아닌 Func이기 때문입니다.

세부 정보가 ICollection이므로 IEnumerable "Where"에 대한 OrderDetails 링크의 ".Where"링크 때문에 Expression<Func<OrderDetail,bool>>으로 변경하면 작동하지 않습니다.

따라서 트래버스 된 속성이 IEnumerable 또는 similair 인 경우 더 큰 Linq 쿼리의 일부를 추출 할 수 있습니까?

답변

0

Expression<Func<OrderDetail,bool>> detailPredicate = d => d.Foo > 0; 
+0

이 OrderDetails의 이후 작동하지 않습니다는 ICollection에와 ICollection에에 절은 Func을하지 표현을 사용하는 곳