2017-11-21 8 views
3

私はグリッドに列があります。グリッド列ヘッダーが選択されたとき、x行を返すように選択されたヘッダーでサーバーにajax/ajaxをポストします。Entity Frameworkコレクションのソートを実行するために汎用Funcが必要

次のコードでは、RefNoは整数で、ProposalSectionNumberは文字列です。

文字列を取りますが、linq文で使用するFuncを返す汎用関数を作成するにはどうすればよいですか?

if (sort.dir == SortDirection.Asc) 
{ 
    switch (sort.field) 
    { 
     case "RefNo": 
      qry = qry.OrderBy(x => x.RefNo); 
      break; 
     case "ProposalSectionNumber": 
      qry = qry.OrderBy(x => x.ProposalSectionNumber); 
      break;      
    } 
} 
else 
{ 
    switch (sort.field) 
    { 
     case "RefNo": 
      qry = qry.OrderByDescending(x => x.RefNo); 
      break; 
     case "ProposalSectionNumber": 
      qry = qry.OrderByDescending(x => x.ProposalSectionNumber); 
      break; 

    } 
} 

私は、文字列またはに基づいて返す関数SortFuncを(作成苦戦している 文字列はsortOrder = "REFNO" するvar sortfunc = SortFunc(はsortOrder)

if (sort.dir == SortDirection.Asc) 
{ 
    qry = qry.OrderBy(sortFunc) 
} 
else 
{ 
    qry = qry.OrderByDesc(sortFunc) 
} 

ような何かをしたいと思います整数)

これを達成する最も良い方法は何ですか?

+1

はSystem.Linqのを使用してください。動的ナゲットパッケージでは、プロパティ名を文字列として並べ替えることができます。 – Mant101

答えて

3

sortFuncの型を宣言する際の問題は、ソートするフィールドの型によって異なります。すべてのフィールドが同じタイプの場合(たとえば、すべてstring)、sortFunc変数にはExpression<Func<MyEntity,string>>のタイプを使用できます。

並べ替えフィールドが共通タイプを共有していない場合、コードの重複を削除する別の方法があります。パラメータとしてソート順をとり、一般的なヘルパーメソッドを導入し、OrderBy/OrderByDescendingするのではなく、それを呼び出す:次のように

private static IOrderedQueryable<T> AddOrderBy<T,TKey>(
    IQueryable<T> orig 
, Expression<Func<T,TKey>> selector 
, bool isAscending 
) { 
    return isAscending ? orig.OrderBy(selector) : orig.OrderByDescending(selector); 
} 

は今、あなたはあなたのコードを書き換えることができます。

var isAscending = (sort.dir == SortDirection.Asc); 
switch (sort.field) { 
    case "RefNo": 
     qry = qry.AddOrderBy(x => x.RefNo, isAscending); 
     break; 
    case "ProposalSectionNumber": 
     qry = qry.AddOrderBy(x => x.ProposalSectionNumber, isAscending); 
     break;      
} 
関連する問題