2017-01-14 5 views
0

는 동적으로 내 쿼리에 순서를 추가 할 수 있도록 :체인화 된 IQueryable 식 트리

Expression<Func<IQueryable<MyEntity>, IOrderedQueryable<MyEntity>>> order1 = e => e.OrderBy(x => x.Weight); 
Expression<Func<IQueryable<MyEntity>, IOrderedQueryable<MyEntity>>> order2 = e => e.OrderByDescending(x => x.Weight).ThenBy(x => x.Price); 
Expression<Func<IQueryable<MyEntity>, IOrderedQueryable<MyEntity>>> order3 = e => e.OrderBy(x => x.Category).ThenBy(x => x.Price); 

IQueryable<MyEntity> query = any EF query; 

var transformedQuery = query.Transform(order1/order2/order3); 

어떻게 Transform()을 구현합니까?

public static IQueryable<T> Transform<T>(this IQueryable<T> query, Expression<Func<IQueryable<T>, IOrderedQueryable<T>>> orderExpr) 
{ 
    // ?????????????????? 
} 

내 문제는 내가 순서를 오름차순/내림차순 2 과부하를 갖고 싶어하지 않는다는 것입니다. OrderBy()/OrderByDescending() 표현식이나 그 조합을 전달해야합니다.

+0

AddOrder에서도 첫 번째 주문을 추가 할 수 없습니까? –

+0

불행히도 아니요, 쿼리에 순서를 추가 한 후 다른 변형을 수행하는 일반 메서드가 필요합니다. – UserControl

+0

원래 OrderBy/ThenBy의 문제점은 무엇입니까? @ hdv는 당신이 다른 것을 필요로하지 않는다고 말했기 때문에 (아무 것도 놓치지 않으면 ...) –

답변

0

이 아닌 경우에 표현식 트리가 필요합니다. 또는 도우미 방법.

Func<IQueryable<MyEntity>, IOrderedQueryable<MyEntity>> order = e => e.OrderBy(x => x.Weight); 
IQueryable<MyEntity> query = any EF query; 

var transformedQuery = order(query); 

order가 쿼리에 전달 될 때, 그 자체가 식 트리를 취 적절한 Queryable.OrderBy 오버로드를 호출 할 수 있기 때문에이 작동합니다.

+0

나는 내가 이해하고 있는지 잘 모르겠다. 변환 된 쿼리가 EF 공급자에게 전달되므로 식 (expression)으로 주문 매개 변수가 필요합니다. – UserControl

+0

@UserControl'order'는'x => x.Weight'를 표현식 트리로 전달합니다. 이것은 EF가 SQL로 변환 할 수 있도록하기에 충분합니다. 'context.MyEntities.OrderBy (e => e.MyProperty)'를 직접 쓰면, 이것은 같은 방식으로'Queryable.OrderBy'에 대한 직접 호출입니다. – hvd