2011-02-02 24 views
1

グリッドビューには複数の列があり、そのうち3つは並べ替えたいものです。 データのソースはセッションで保持されます。グリッドビューと動的linqの並べ替え

protected void MyGridHistorySort(object sender, GridViewSortEventArgs e) 
{ 
    var TheColumn = (e.SortExpression).ToString(); 

    TheDataHistory = (List<ViewDataHistoryModel>)Session["SessionDataHistory"]; 

    var test = "data.DataDate"; 

    var NewDataSource = from data in TheDataHistory 
        orderby test 
        select data; 

    MyGridHistory.DataSource = NewDataSource; 
    MyGridHistory.DataBind(); 

DataDateはリスト内の有効な列ですが、orderby文は機能しません。理想的には、変数「TheColumn」を使って、test = "data" + TheColumのようなものを書いて並べ替えたいと思います。ブール値に基づいて並べ替え方向を追加します。私はOrderBy拡張メソッドNewDataSource.OrderBy(test)を見ました。しかしそれはどちらもうまくいかない。

私のコードを動作させるには、何が欠けていますか?

ありがとうございました。

答えて

1

あなたはORDERBY句は、プロパティ名がかかるため

var NewDataSource = from data in TheDataHistory 
        orderby data.DataDate 
        select data; 

を持っている必要がありますように見えます。この節は、Dynamic Queryableのように何を注文するかを決定するために文字列を解析しません。

それとも、単にこれをソートする文字列を使用しての、本当に曲がっている場合は、複数のフィールドでソートする場合には、私は

var NewDataSource = from data in TheDataHistory 
        select data; 

switch(fieldToSortOn) 
{ 
    case "field1": 
    NewDataSource = NewDataSource.OrderBy(x => x.Field1); 
    break; 
    case "field2": 
    NewDataSource = NewDataSource.OrderBy(x => x.Field2); 
    break; 

    ... 

} 

を使用することになり、その後、私は完全にDynamic Queryableライブラリをお勧めします。 (いくつかは、DateTimeのためのサポートを追加して?オブジェクトを)私はそれを使用してきた、それは私が最近行ってきた何のために最適です

NewDataSource = NewDataSource.DynamicOrderBy("ID DESC, Name DESC, Price ASC"); 

は、このライブラリを愛しようにその後、あなたは物事を行うことができます!

+0

つの列のために働くいや、私はそれを他のすべての列に対して機能させ、orderbyに文字列パラメータを取らせたいと思います。 OrderBy拡張メソッドはどのように機能しますか? – frenchie

+0

この場合、私はおそらくorderby節なしで同じステートメントを使用して、引数を介して渡されるフィールドによって注文するswitchステートメントを持っています。私はこれを示すために私の答えを編集しています... – khr055

+0

私はちょうどスイッチの節でそれをしました。私はそれを行うより良い方法がなければならないことを知っていますが、今のところそれは機能します。準最適なコードですが、今は大丈夫です。 – frenchie

0

あなたはこの式のためDynamic Linqを使用することができます。

string sortExpression = "ContactName DESC";  
var x1 = context  
    .Customers  
    .OrderBy(sortExpression); 
+0

これはすでに私がやっていることですが、それはうまくいかないことです。 OrderByは、たとえASCまたはDESCであっても、パラメータとして文字列を受け取っていないようです。 – frenchie

+1

Dynamic.csファイルをダウンロードしてプロジェクトに組み込み、System.Linq.Dynamic名前空間を使用しましたか?標準Linqは動的式をサポートしていないためです。 – Marc

関連する問題