2017-01-25 21 views
0

未定義の列数(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(); 

答えて

0

あなたはこのように[並べ替え後ThenByを書く必要があります。

query = query 
      .OrderBy(t=> // your condition) 
      .ThenBy(t=> // next condition); 
+0

私の主な問題は、定義されていない数の列に対して動的に行うことです。 – Ricky

2

問題はThenByがIQueryableで定義されていないことですが、IOrderedQuerya (これはIQueryable.OrderByが返すものです)。したがって、後続のThenBy呼び出しを実行するためにIOrderedQueryableの新しい変数を定義する必要があります。私はSystem.Data.DataTable(あなたの "param"オブジェクトに似た構造を得るために)を使用するために元のコードを少し変更しました。このコードでは、DataTableに少なくとも1つの列があることも前提としています。

// using System.Data.DataTable to provide similar object structure as OP 
DataTable param = new DataTable(); 
IQueryable<DataTable> query = new List<DataTable>().AsQueryable(); 

// OrderBy returns IOrderedQueryable<TSource>, which is the interface that defines 
// "ThenBy" so we need to assign it to a different variable if we wish to make subsequent 
// calls to ThenBy 
var orderedQuery = query.OrderBy(x => x.GetType().GetProperty(param.Columns[0].ColumnName)); 

//for each other selected column 
for (int i = 1; i < param.Columns.Count; i++) 
{ 
    orderedQuery = orderedQuery.ThenBy(x => x.GetType().GetProperty(param.Columns[i].ColumnName)); 
} 
+0

感謝@Dave、それは仕事をします。物事を働かせないように細かいところがあります。実行され、実際に実行されるためには、クエリは.ToList()を使用する必要があります。しかしToList()を使用すると、すべてが再び崩れます... – Ricky

関連する問題