如何使用.skip(i).take(j)使用lambda表达式导航从数据库中获取给定范围的数据行
本文关键字:获取 数据库 范围 数据 表达式 skip 何使用 take lambda 使用 导航 | 更新日期: 2023-09-27 18:22:14
我使用以下代码来获取绑定网格视图的数据,但出于性能问题,我只想获得选定的数据行范围,比如第一页的1-10,第二页的11-20。。。。我如何修改以下代码
public IQueryable<Employee> SelectEmployees(string SortColumn, string SortOrder, long UserID,---int start,---int end)
{
IUnitOfWork objUow;
var arg = Expression.Parameter(typeof(Employee), "Employee");
var sortProperty = Expression.Property(arg, SortColumn);
var lambda = Expression.Lambda(sortProperty, arg);
var param = Expression.Parameter(typeof(IQueryable<Employee>));
var orderByCall = Expression.Call(typeof(Queryable), SortOrder, new Type[] { typeof(Employee), sortProperty.Type }, new Expression[] { param, lambda });
var orderLambda = Expression.Lambda<Func<IQueryable<Employee>, IQueryable<Employee>>>(orderByCall, param).Compile();
var Ids = objUow.Repository<Users>().Entities.Where((x => x.ID == UserID)).Select(y => y.Id);
return orderLambda(objUow.Repository<Employee>().Entities.Where(x => x.IsDeleted != true && x.Status == 1 && Ids.Contains(x.CheckID)));
}
我试过skip().take(),但它导致了错误。。。
return orderLambda((objUow.Repository<Employee>().Entities.Where(x => x.IsDeleted != true && x.Status == 1 && Ids.Contains(x.CheckID))).Skip(0).Take(10));
EntityFramework.SqlServer.dll中发生类型为"System.NotSupportedException"的异常,但未在用户代码中处理
附加信息:只有LINQ to Entities中的排序输入才支持方法"Skip"。方法"OrderBy"必须在方法"Skip"之前调用。
我能做一些低于的事情吗
IQueryable<Employee> Obj= orderLambda(objUow.Repository<Employee>().Entities.Where(x => x.IsDeleted != true && x.InvalidStatus == 1 && shopids.Contains(x.CheckID)));
Obj.Skip(0).Take(10);
您需要知道每次查询数据库时要跳过多少记录。为了做到这一点,您应该将页码乘以页面大小。这里有一个例子:
int skipAmount = pageNumber * pageSize;
_repository.Where(a => a.IsDeleted != false)
.OrderBy(a => a.Date)
.Skip(skipAmount)
.Take(pageSize);
return orderLambda((objUow.Repository<Employee>()
.Entities.Where(x => x.IsDeleted != true && x.Status == 1 && Ids.Contains(x.CheckID)))
.OrderBy(x=> x.CheckID) // you must order the results before skip and take
.Skip(0)
.Take(10));
错误告诉你
编辑
要按字符串排序,您可能需要System.Linq.Dynamic nuget包和命名空间。然后您可以将我的OrderBy替换为OrderBy(SortOrder)然后你可以做
OrderBy(string.Format("{0} {1}", SortOrder, SortDirection)) // where Sort direction can be "descending" if it's reversed
// replace 0 & 10 as appropriate