linq表达式函数的动态排序

时间:2016-06-12 16:06:29

标签: c# linq

我正在开发一个使用asp.net webapi的现有项目,我是Linq的新手,所有编写项目代码的团队都已经离开了。

我在这样的web api控制器中有一个功能:

button {
  height: 25px;
  margin-top: 1px;
}
form * {
  margin: 10px, 10px, 10px;
}
input {
  float: left;
  margin-top: 2px;
}

public IQueryable<AccessTypeDTO> GetAccessTypes(int pageIndex = 1, int pageSize = 25) { var model = db.AccessTypes.AsQueryable(); return model.Select(AccessTypeDTO.SELECT).Take(pageSize); } 我们的视图模型,我们的域模型是基于EF的

AccessTypeDTO DM如下:

AccessType

public partial class AccessType { public int AccessTypeID { get; set; } public string AccessTypeName { get; set; } } VM的数据映射和获取如下

AccessTypeDTO

我的新任务是实现分页和结果的顺序,所以我的web API函数应该如下:

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

主要问题在于我正在构建的函数中,Skip函数要求在跳过之前对集合“集合”进行排序。 那么我该如何排序这个系列呢? 请注意,我有一百多个控制器需要更新,并且像这样进行分页和排序,我没有时间为每个控制器编写服务并为每列写入开关,进行排序

1 个答案:

答案 0 :(得分: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); 

关于(pageIndex-1) - 我不愿从pageIndex = 0开始,这样我就不需要-1了。