2016-06-12 62 views
0

我正在使用asp.net webapi的現有項目,我是Linq的新手,所有編寫項目代碼的團隊都離開了。linq表達式函數的動態排序

我有一個像在Web API controlller一個funtion:

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 
      }; 
} 

我的新任務,以實現對結果分頁和秩序,所以我的網絡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); 
} 

主要的問題是在我建立了跳過功能的功能要求收集「收集」在跳過之前進行排序。 那麼我如何分類這個集合呢? 請注意,我有超過一百個控制器被更新,並有這樣的分頁和排序,我沒有時間爲每個控制器編寫服務,併爲每列寫入開關,做分類

回答

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) - 我preffer從pageIndex = 0開始,這樣我就不需要有-1。

+0

謝謝親愛的。我認爲跳過應該是:.Skip((pageIndex - 1)* pageSize).Take(pageSize); 如何按字段動態訂購訂單? – Mohammad