ユーザーの選択に基づいて1〜6のフィールドで並べ替えることができる顧客のリストがあります。並べ替えフィールドは任意の順序にすることができます。フィールドとシーケンスが事前にわかっている場合、並べ替えは簡単です。
customers = customers
.OrderBy(c => c.LastName)
.ThenBy(c => c.City)
.ThenBy(c => c.Age).ToList();
実行時に並べ替えフィールドをどのように渡しますか?このようなことをする方法はありますか?
string sortField1 = "State";
string sortField2 = "City";
string sortField3 = "Type";
customers = customers
.OrderBy(c => c.sortField1)
.ThenBy(c => c.sortField2)
.ThenBy(c => c.sortField3).ToList();
これを解決するには、ForEachループで.OrderByステートメントをチェーンします。 .OrderByは、ユーザーが選択した各ソート基準のLinqクエリに追加されます。リストをIQueryableでラップすることで、作成されたLinqクエリを確認できます。
IQueryable<CustomerMaster> query = customers.AsQueryable();
// reverse the sort order (sorts are applied incrementally)
// We need the user's last
// sort criteria to get applied first
sortOrder.Reverse();
foreach (var sortItem in sortOrder)
{
switch (sortItem)
{
case "LName":
query = query.OrderBy(c => c.LName);
break;
case "State":
query = query.OrderBy(c => c.State);
break;
default:
query = query
.OrderBy(c => c.LName)
.ThenBy(c => c.State);
break;
}
}
customers = query.ToList();
// set the sortorder back to user's order
sortOrder.Reverse();
}
結果のクエリ:
query = {System.Collections.Generic
.List`1[CustomerMaster]
.OrderBy(c => c.LName)
.OrderBy(c => c.State)}
実行時に動的LinQクエリを構築する方法のチュートリアルについては、 http://tomasp.net/articles/dynamic-linq-queries.aspxを参照してください。これはあなたが探しているものでなければなりません。