2016-06-24 8 views
1

私はリポジトリを構築しています。並べ替えのリストを関数に渡して、エンティティを正しい順序で返すことができます。 並べ替え式のリストを使用してクエリ可能なものを並べ替える

は、私が見つけたそのLINQ意志を正しくソートあなたは

 foreach (var s in sorts.Reverse()) 
     { 
      query = query.OrderBy(s); 
     } 

しかし、私はそれことがわかっソート方向の追加のテスト中...種類のリストを逆にして、各ソート式のためにORDERBYを使用使用している場合のみ最初の並べ替え方向をとり、各並べ替えでその方向を適用するようです。

private void applySorts(ref IQueryable<TEntity> query, Dictionary<Expression<Func<TEntity, dynamic>>, string> sorts) 
    { 
     if (sorts != null) 
     { 
      foreach (var s in sorts.Reverse()) 
      { 
       Expression<Func<TEntity, dynamic>> expr = s.Key; 
       string dir = s.Value; 
       if (dir == "d") 
       { 
        query = query.OrderByDescending(expr); 
       } 
       else 
       { 
        query = query.OrderBy(expr); 
       } 
      } 
     } 
    } 

私はもともと最初のソート上のOrderBy使用し、ThenByに切り替えしようとしたが、ThenByはIOrderedQueryableの種類を必要とするので、これは不可能です。

私は辞書の使用が最良ではないかもしれないことに注意したいと思います。より良いアイデアがあれば分かち合いましょう。しかし、私はそれを稼働させ、物事がどのように進むのかを見たいと思っていました。

私はC#、Linq、およびEntity Frameworkを使用しています。

お時間をいただきありがとうございます。

更新:残念ながら、これは数字のソートをサポートしていないことがわかりました。あなたはまたでソート使用することができます

bool first = true; 

foreach(var s in sorts) 
{ 
    query = first ? query.OrderBy(s) : query.ThenBy(s); 
} 
// It will became like query.OrderBy(a => a.A).ThenBy(a => a.B).ThenBy(a => a.C)... 

:エラー(型に型「可能System.Int32」をキャストすることができません「のSystem.Object」)

+0

私はCompareTo()メソッドを実装するIComparableを継承するカスタムクラスであるキーでSortedDictionaryを使用します。投稿を参照してください:http://stackoverflow.com/questions/4188013/c-sharp-interfaces-how-to-implement-icomparable – jdweng

答えて

0

あなたはこのようにチェーンにあなたのフィルタをThenBy()方法を使用することができますLINQクエリで複数の列はあなたがソートされた上での特性を知っている場合:

var result = (from row in list 
       orderby row.A, row.B, row.C 
       select row).ToList(); 
+0

'var query = query.OrderBy(ソート[0]);'はコンパイルされません。 – hvd

+0

@hvdそれは辞書だと気付かなかった。 :)そして、彼はループを 'foreach'に変更するだけで、' for'の代わりに 'for 'を行うことができます。最初のソート式に 'OrderBy()'を、他のすべてに 'ThenBy()'を適用するだけです。 –

+0

Heh、実際には、パラメータと同じ名前のローカル変数を使用できないことを意味しましたが、それもそうです。 :)編集したバージョンでは、 'query.ThenBy'はコンパイルされません。' query'の型は 'IQueryable 'です。あなたは最初のバージョンに近づきました。別の変数が必要です。別の名前を付けるだけです。 – hvd

1

文法的には、あなたが必要とするすべてのタイプIOrderedQueryableの一時変数です。

私のような何かをしようとするだろう:

private void applySorts(ref IQueryable<TEntity> query, Dictionary<Expression<Func<TEntity, dynamic>>, string> sorts) 
{ 
    if (sorts != null) 
    { 
     IOrderedQueryable<TEntity> tempQuery = null; 
     bool isFirst = true; 
     foreach (var s in sorts.Reverse()) 
     { 
      Expression<Func<TEntity, dynamic>> expr = s.Key; 
      string dir = s.Value; 
      if (first) 
      { 
       first = false; 
       if (dir == "d") 
       { 
        tempQuery = query.OrderByDescending(expr); 
       } 
       else 
       { 
        tempQuery = query.OrderBy(expr); 
       } 
      } 
      else 
      { 
       if (dir == "d") 
       { 
        tempQuery = tempQuery.ThenByDescending(expr); 
       } 
       else 
       { 
        tempQuery = tempQuery.ThenBy(expr); 
       } 
      } 
     } 
     query = tempQuery; 
    } 
} 

編集:

上記溶液への鍵はIOrderedQueryableでのIQueryableであるということです。

私はそれを自分で試していません。しかし、これは文法的な解決策に過ぎないことを強調したいと思います。

関連する問題