我有一個查詢IQueryable並想動態地對其應用排序,排序可以在許多列(asc或desc)上。我已經寫了下面的一般功能:LINQ:在許多列上動態排序
private IQueryable<T> ApplySorting<T,U>(IQueryable<T> query, Expression<Func<T, U>> predicate, SortOrder order)
{
if (order == SortOrder.Ascending)
{
{
return query.OrderBy<T, U>(predicate);
}
}
else
{
{
return query.OrderByDescending<T, U>(predicate);
}
}
}
SortOrder的是我的簡單枚舉有兩個值:升序和降序
然後我調用這個函數在一個循環中,該用戶請求的排序每一列。但是我注意到它失敗了,因爲它總是按最後一列使用,而忽略其他列。
後來我發現有上IOrderedQueryable一個「ThenBy」的方法,從而有效的用法是:
var q = db.MyType.OrderBy(x=>x.Col1).ThenBy(y=>y.Col2); //etc.
但我怎樣才能使它通用?我試圖測試,如果查詢是IOrderedQueryable,但它似乎始終是真實的,即使它是最簡單的var q =從db.MyType x中選擇x
我不知道爲什麼它是這樣設計的。出了什麼問題:
var q = db.MyType.OrderBy(x=>x.Col1).OrderBy(y=>y.Col2); //etc.
它是這麼多直觀
我認爲他們不會讓.OrderBy(.. Col1中..)。排序依據(.. col2的..)飛是因爲他們知道沒有什麼好辦法,如果預期最終結果是按Col1排序,然後按Col2重新排序整個列表;或Col1,然後是Col2的子排序(按照您的意圖) – 2010-07-23 15:46:52
當您編寫.OrderBy時,查詢執行被延遲,直到您第一次遍歷查詢集時纔會發生任何事情。 – PawelRoman 2010-07-23 15:55:22