2016-06-12 10 views
0

私はasp.net webapiを使用している既存のプロジェクトで作業しています。私はLinqを初めて使っており、プロジェクトコードを書いたチームはすべて消えています。linq式関数の動的ソート

は、私はそのようなWeb APIのcontrolllerで目的球があります。

public IQueryable<AccessTypeDTO> GetAccessTypes(int pageIndex = 1, int pageSize = 25) 
{ 
    var model = db.AccessTypes.AsQueryable(); 
    return model.Select(AccessTypeDTO.SELECT).Take(pageSize); 
} 

AccessTypeDTO私たちのビューモデルを、我々はドメインモデルがEF基づいて持って

AccessType DMは以下の通りです:

​​

AccessTypeDTO VMのマッピングとデータ取得は、次のようになります。

public class AccessTypeDTO 
{ 
    public int AccessTypeID { get; set; } 
    public string AccessTypeName { get; set; } 

    public static System.Linq.Expressions.Expression<Func<AccessType, AccessTypeDTO>> SELECT = 
      x => new AccessTypeDTO 
      { 
       AccessTypeID = x.AccessTypeID, 
       AccessTypeName = x.AccessTypeName 
      }; 
} 

私の新しいタスクは結果のページングと秩序を実装するので、次のように私のWeb API関数は次のようになります。

public IQueryable<AccessTypeDTO> GetAccessTypes(int pageIndex = 1, int pageSize = 25, string orderBy = "AccessTypeID") 
{ 
    var collection= db.AccessTypes.AsQueryable(); 

    return collection.Select(AccessTypeDTO.SELECT).Skip((pageIndex - 1) * pageSize).Take(pageSize); 
} 

主な問題は、私はスキップ機能することを構築しています機能でありますスキップする前にコレクション "コレクション"をソートする必要があります。 どうすればこのコレクションを並べ替えることができますか? 私は100以上のコントローラを更新し、このようなページングと並べ替えを行い、並べ替えを行うために、各コントローラと各列のスイッチを書き込む時間がないことに注意してください。

答えて

0

何か

public static class MyLinqExtensions 
{ 
    public static IQueryable<AccessTypeDto> GetPage(this IQueryable<AccessType> source, int pageIndex, int pageSize) 
    { 
     return source.Select(x => new AccessTypeDto() 
     { 
      AccessTypeID = x.AccessTypeID, 
      AccessTypeName = x.AccessTypeName 
     }).OrderBy(x => x.AccessTypeID).Skip(pageIndex*pageSize).Take(pageSize); 
    } 
} 

、あなたはこのようなあなたのコレクションにそれを使用することができます:このようにあなたを助けるかもしれない

collection.GetPage(1,25); 

はそれに役立つことを願っています!

編集:

public static IQueryable<AccessTypeDto> GetPage(this IQueryable<AccessType> source, int pageIndex, int pageSize, Expression<Func<AccessTypeDto,object>> predicate) 
    { 
     return source.Select(x => new AccessTypeDto() 
     { 
      AccessTypeID = x.AccessTypeID, 
      AccessTypeName = x.AccessTypeName 
     }).OrderBy(predicate).Skip(pageIndex * pageSize).Take(pageSize); 
    } 

をして、あなたはこのように、メソッドを呼び出すことができます:

は、あなたがこのようなあなたの方法を変更することができます

collection.GetPage(1,25,x=>x.AccessTypeId); 

または

collection.GetPage(0,25,x=>x.AccessTypeId); 

(pageIn dex-1) - 私はpageIndex = 0から始めることを前提にしており、このようにして-1を持つ必要はありません。

+0

ありがとうございます。私はスキップがあるべきだと思う:.Skip((pageIndex - 1)* pageSize).Take(pageSize); どのようにフィールドの動的に注文を行うことができますか? – Mohammad