3
有人可以解釋一下建立一個表達式的語法,該表達式將OrderBy在一個實體上的用戶指定的屬性?如何編寫一個Linq表達式來調用一組實體上的OrderBy?
這篇MSDN文章幫助很長,但它處理一個簡單的字符串列表,我的數據集包含我自己的自定義對象。
http://msdn.microsoft.com/en-us/library/bb882637.aspx
有人可以解釋一下建立一個表達式的語法,該表達式將OrderBy在一個實體上的用戶指定的屬性?如何編寫一個Linq表達式來調用一組實體上的OrderBy?
這篇MSDN文章幫助很長,但它處理一個簡單的字符串列表,我的數據集包含我自己的自定義對象。
http://msdn.microsoft.com/en-us/library/bb882637.aspx
代碼首先,解釋以後。
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