我正在开发一个使用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函数要求在跳过之前对集合“集合”进行排序。 那么我该如何排序这个系列呢? 请注意,我有一百多个控制器需要更新,并且像这样进行分页和排序,我没有时间为每个控制器编写服务并为每列写入开关,进行排序
答案 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了。