2012-08-31 36 views

回答

9

代碼首先,解釋以後。

IQueryable<T> data = this.Database.ObjectsOfType<T>(); 

var eachItem = Expression.Parameter(typeof(T), "item"); 
var propertyToOrderByExpression = Expression.Property(eachItem, propertyName); 

var runMe = Expression.Call(
    typeof(Queryable), 
    "OrderBy", 
    new Type[] { data.ElementType, typeof(IComparable) }, 
    data.Expression, 
    Expression.Lambda<Func<T,IComparable>>(propertyToOrderByExpression, new ParameterExpression[] { eachItem })); 

因此,首先我們得到數據作爲一個Queryable對象。這有一種'根'表達式屬性,我們需要這樣做。

eachItem事物是一個表達式,它表示Lambda中的參數佔位符,如果您願意的話,該表達式是符號。

然後我們創建一個表達式來執行讀取操作,該屬性名稱由用戶在propertyName中指定。

我們最終構建了一個表達式,它對Queryable數據上的OrderBy方法進行調用。我們說(按參數順序):

Expression.Call(
[what's the type on which we want to call a method?], 
[what's the name of the method we're calling?], 
[if this method is generic, what are the types it deals with?], 
{ 
    [expression representing the data], 
    [expression for the lambda using the reader exp + each item exp] 
}) 

最後兩個在{}中,因爲它實際上是一個參數數組。我使用了IComparable,因爲該屬性可以是任何類型,但顯然需要進行比較才能訂購。

Luke

相關問題