1

LINQ to Entities 쿼리 위에 집계 함수를 동적으로 대체하여 데이터베이스에서 작업을 수행하고 동시에 어떤 함수를 하드 코딩하지 않아야합니까? , 예. 이 같은 쿼리에 Max() 또는 Min()Average() 대체 : 나는 쿼리 내부에 넣어 수 있습니다 성공적으로 SQL로 번역되는식이 트리에 Queryable.Average()를 번역 붙어LINQ에서 엔터티로 집계 함수를 표현하는 트리

IQueryable<Order> orders = ordersRepository.GetAll(); 
var q = from o in orders 
     group o by o.OrderDate into g 
     select new 
     { 
      OrderDate = g.Key, 
      AggregatedAmount = g.AsQueryable() 
           .Average(x => x.Amount) 
     }; 

.

+0

지금까지 시도한 내용에 대해 자세히 설명해 주시겠습니까? 쿼리에 임의의 표현식을 연결할 수있는 작은 라이브러리가 있습니다. 나는 지금 그 이름을 기억할 수 없다. – usr

+0

@usr : 이것은 내 문제입니다. 접근 방법, 시작 위치를 모르겠습니다. Google은 where 절에 대해 예측할 수있는 빌더로 가득 차 있지만 의심의 여지가 없습니다. 그러나 아무도 선택자를 쓰려고하지 않는 것 같습니다. – abatishchev

답변

1

g.Average(x => x.Amount)Queryable.Average(g, x => x.Amount)입니다. Queryable.Average 부분을 교체하고 싶습니다. 그런 :

Expression<Func<IQueryable<Order>, Func<Order, double>>> aggregate = ...; 

그리고 식 사용

AggregatedAmount = aggregate(g, x => x.Amount) 

문제는 당신이 식을 호출 할 수 있다는 것입니다을. 그래서 AsExpandable를 사용

var q = from o in orders.AsExpandable() 
... 
AggregatedAmount = aggregate.Compile()(g, x => x.Amount) 

이것은 쿼리 식에 aggregate를 인라인 EF조차 있었는지 알고하지 않도록.

+0

괜찮 으면 오타를 몇 개 수정했습니다. – abatishchev

+1

이것은 대단한 시작입니다. 정말 고마워요! – abatishchev

+0

흠,'Complle()() '을 호출해야합니까? 오류가 발생했습니다 : 'System.Linq.Expressions.InstanceMethodCallExpressionN' 유형의 객체를'System.Linq.Expressions.LambdaExpression'을 입력하여 전송할 수 없습니다. – abatishchev

관련 문제