2012-05-11 23 views
6

私はsortパラメータをチェックし、if文の束を構築しています:このソートコードを改善するにはどうすればよいですか?

if (sortDirection == "ASC") 
{ 
    if (sortBy == "Id") 
     return customerList.OrderBy(x => x.Id).Skip(startIndex).Take(pageSize).ToList(); 
    if (sortBy == "FirstName") 
     return customerList.OrderBy(x => x.FirstName).Skip(startIndex).Take(pageSize).ToList(); 
    if (sortBy == "City") 
     return customerList.OrderBy(x => x.City).Skip(startIndex).Take(pageSize).ToList(); 
} 
else 
{ 
    if (sortBy == "Id") 
     return customerList.OrderByDescending(x => x.Id).Skip(startIndex).Take(pageSize).ToList(); 
    if (sortBy == "FirstName") 
     return customerList.OrderByDescending(x => x.FirstName).Skip(startIndex).Take(pageSize).ToList(); 
    if (sortBy == "City") 
     return customerList.OrderByDescending(x => x.City).Skip(startIndex).Take(pageSize).ToList(); 
} 

は、どのように私はこれを改善するのですか?

+6

「より良い」と定義します。何のために良い? – Oded

+1

どのようにして "改善"したいですか?意図したとおりに動作しませんか?それは遅すぎますか?コードがどのように構造化されているのが好きではありませんか?ここにはさらに詳しい情報が必要です。 –

+0

私はLINQ構成を使用することをお勧めします。 http://stackoverflow.com/questions/5881107/how-can-i-build-entity-framework-queries-dynamically/5882243#5882243 – Euphoric

答えて

8

ご発注やクエリの残りの部分を分離 - 各クエリに対して同一部分には、あなたのコードベースで複製する必要はありません(DRYそれを維持):

var query = customerList; 

if (sortDirection == "ASC") 
{ 
    if (sortBy == "Id") 
     query = query.OrderBy(x => x.Id); 
    ///and so on 
} 

query = query.Skip(startIndex).Take(pageSize).ToList(); 
+0

これはまだ、すべてのフィールドのための定型文の多くは、はるかにクリーンな反射ではないでしょうか?彼は50のフィールドを持っていたと想像してみてください! :) – mattytommo

+0

@ NiklasB。これは問題になります。なぜなら、OrderByは汎用的であり、ラムダはすべてのプロパティに対して異なるタイプを持つからです。それをどこにでもオブジェクトに変換したいのでない限り。 – Euphoric

+0

@mattytommo:これは確かに可能で、これはメモリ内のコレクションの場合はきれいです – BrokenGlass

2

使用反射を:)

customerList = (sortDirection == "ASC") 
    ? customerList 
     .OrderBy(x => x.GetType().GetProperty(sortBy).GetValue(x, null)) 
     .Skip(startIndex) 
     .Take(pageSize) 
     .ToList() 
    : customerList 
     .OrderByDescending(x => x.GetType().GetProperty(sortBy).GetValue(x, null)) 
     .Skip(startIndex) 
     .Take(pageSize) 
     .ToList(); 
1

プロパティ名を文字列として並べ替えるだけのようです。その場合には、これは実際にはすでに「動的LINQ」を使用することによって解決される:

Dynamic LINQ OrderBy on IEnumerable<T>

は、この質問の答えを見て、それがあなたの問題を解決するために、サンプルコードを提供しなければなりません。

関連する問題