2016-09-27 15 views
1

私はC#seleniumの自動化テーブルを作成しており、ダイナミックLinqを使用していくつかの助けが必要です。私は基本的なAcctNum,AcctDateAcctNameレコードを持っていて、各フィールドはユーザーがソートできるとしましょう。彼らはAcctNum(昇順)、AcctDate(昇順)、そして最後にAcctName(昇順)を選択できます。だろうダイナミックLinqオーダー変数

var sortedCode = records.OrderBy(r => r.AcctNum) 
         .ThenBy(r => r.AcctDate) 
         .ThenBy(r => r.AcctName) 
         .ToList(); 

ユーザーもAcctNum(DESC)を選択することができますしかし、AcctDate(ASC)、最後にAcctName(DESC)。

私がしたいのは、Dynamic Linqを使って各ソート順を変数にすることです。

だから、のようなもの:

//passed in values: 
var varAcctNumOrd = "desc"; 
var varDateOrd = "asc"; 
var varAcctOrd = "desc"; 

var sortedCode = records.OrderBy(r => r.AcctNum, varAcctNumOrd) 
         .ThenBy(r => r.AcctDate, varDateOrd) 
         .ThenBy(r => r.AcctNum, varAcctOrd) 
         .ToList(); 

これは可能ですか?

+0

あなたは(昇順/降順)ダイナミック方向を求めていますフィールドも動的ですか?そして、動的LINQ( 'System.Linq.Dynamic')と呼ばれるbtwは、文字列で動作します。 –

+0

ちょっとイワン。テストケースは、各フィールドの昇順または降順の変数を渡します。これらの変数のそれぞれをソート順に渡すだけで、ソートがUIで正しく動作していることを検証できます。 – Dazed

+0

そして、 'records'変数の** type ** --IQueryable 'または 'IEnumerable 'とは何ですか? –

答えて

2

私が正しく理解していれば、次のような単純なカスタム拡張メソッドは、ジョブを実行する必要があります。

public static class LinqExtensions 
{ 
    public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(
     this IEnumerable<TSource> source, 
     Func<TSource, TKey> keySelector, 
     bool ascending) 
    { 
     return ascending ? source.OrderBy(keySelector) : source.OrderByDescending(keySelector); 
    } 

    public static IOrderedEnumerable<TSource> ThenBy<TSource, TKey>(
     this IOrderedEnumerable<TSource> source, 
     Func<TSource, TKey> keySelector, 
     bool ascending) 
    { 
     return ascending ? source.ThenBy(keySelector) : source.ThenByDescending(keySelector); 
    } 

    public static IOrderedQueryable<TSource> OrderBy<TSource, TKey>(
     this IQueryable<TSource> source, 
     Expression<Func<TSource, TKey>> keySelector, 
     bool ascending) 
    { 
     return ascending ? source.OrderBy(keySelector) : source.OrderByDescending(keySelector); 
    } 

    public static IOrderedQueryable<TSource> ThenBy<TSource, TKey>(
     this IOrderedQueryable<TSource> source, 
     Expression<Func<TSource, TKey>> keySelector, 
     bool ascending) 
    { 
     return ascending ? source.ThenBy(keySelector) : source.ThenByDescending(keySelector); 
    } 
} 

と使用方法は次のようになります。

//passed in values: 
var varAcctNumOrd = "desc"; 
var varDateOrd = "asc"; 
var varAcctOrd = "desc"; 

var sortedCode = records.OrderBy(r => r.AcctNum, varAcctNumOrd != "desc") 
         .ThenBy(r => r.AcctDate, varDateOrd != "desc") 
         .ThenBy(r => r.AcctNum, varAcctOrd != "desc") 
         .ToList(); 
+0

ありがとうIvanと他の人。私は迅速な返答を感謝します。私は見て、私はこのすべてを消化することができます参照してください:)。 – Dazed

+0

イワン私は!ありがとう、最初の静的パブリック静的IOrderedEnumerable OrderByWithDirection (このIEnumerableをソース、 – Dazed

+0

@Dazed右にする必要があると思います(と申し訳ありませんが、私はコピーし、 'のIQueryable 'のためにそれをやりました/貼り付け/ 'IEnumerable 'のために調整し、それを逃した)。 –

0

私はあなたの質問を理解していれば、あなたのコレクションのための動的な発注を処理する各列と方向に従って(すなわちAcctNum DESC)

私は、LINQのようなものが文字列でないで動作し、イワンStoevに同意しています型付きクラスで

この問題は、AsQueryable()ソリューションを使用して解決できます。

0

ToListが呼び出されるまで、IQueryableインターフェイスのおかげでクエリが作成されます。単純に方向性を決定するために、いくつかのブール値を持っているとのような順序付けを行います。

var recordsToSort = records.AsQueryable(); 

if (isByAcctNum) 
{ 
    recordsToSort = recordsToSort.OrderBy(r => r.AcctNum); 

    if (isByDate) 
     recordsToSort = recorsToSort.ThenBy(r => r.AcctDate) 

    .... 
} 
else 
{ 
    .... 

} 

return recordsToSort.ToList() 

あなたが最初OrderBy呼び出し、各二次ThenByのコールに次ソートの優先順位ロジックに配置する必要があります。私はあなたに任せて、私はそのデータを知らない。

関連する問題