2016-06-12 43 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