未定義の列数(1以上)に基づくデータの並べ替え/並べ替えが必要です。未定義列の並べ替え/並べ替え(LINQ Entity Framework)
私は何をしようとしていることは必要な列をループし、query'dリストに自分の番号に基づいて[並べ替えやThenByを追加し、しかし、私は失敗したんだ...これを行っ
が、コンパイルされません:
var query = GetAllItems(); //returns a IQueriable list of items
//for each selected column
for (int i = 0; i < param.Columns.Length; i++)
{
if (i == 0)
{
query = query.OrderBy(x => x.GetType().GetProperty(param.Columns[i].Name));
}
else
{
//ERROR: IQueriable does not contain a definition for "ThenBy" and no extension method "ThenBy"...
query = query.ThenBy(x => x.GetType().GetProperty(param.Columns[i].Data));
}
}
この問題を解決するにはどうすればよいですか?または、この要件を達成するための代替方法はありますか?
解決策: @ Dave-Kidderのソリューションはよく考えられ、私が持っていたコンパイルエラーを解決します。ちょうど1つの問題は、OrderByは、ToList()キャストの後に実行するだけです(実際に結果をソートします)。 ToListをIOrderedQueryableに戻すことができないため、これは問題です。 私はいくつかの研究の後、私のすべての問題を解決するソリューションを見つけました。
.NET 4.0の動的言語機能のマイクロソフトのアセンブリ:https://github.com/kahanu/System.Linq.Dynamic
using System.Linq.Dynamic; //need to install this package
更新されたコード:
var query = GetAllItems(); //returns a IQueriable list of items
List<string> orderByColumnList = new List<string>(); //list of columns to sort
for (int i = 0; i < param.Columns.Length; i++)
{
string column = param.Columns[i].Name;
string direction = param.Columns[i].Dir;
//ex.: "columnA ASC"
string orderByColumn = column + " " + direction;
//add column to list
orderByColumnList.Add(orderBy);
}
//convert list to comma delimited string
string orderBy = String.Join(",", orderByColumnList.ToArray());
//sort by all columns, yay! :-D
query.OrderBy(orderBy).ToList();
私の主な問題は、定義されていない数の列に対して動的に行うことです。 – Ricky