2017-01-14 31 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提供者。 – UserControl

+0

@UserControl'order'將作爲表達式樹傳入'x => x.Weight'。這足以讓EF將其轉換爲SQL。當你直接編寫'context.MyEntities.OrderBy(e => e.MyProperty)'時,這是直接調用'Queryable.OrderBy'的方式。 – hvd