2017-01-14 12 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

Я не уверен, что понимаю. Мне нужен параметр ordering как выражение, потому что преобразованный запрос будет передан поставщику EF. – UserControl

+0

@UserControl 'order' будет передаваться в' x => x.Weight' как дерево выражений. Этого достаточно, чтобы позволить EF перевести его в SQL. Когда вы пишете 'context.MyEntities.OrderBy (e => e.MyProperty)' непосредственно, это прямой вызов 'Queryable.OrderBy' таким же образом. – hvd