use*_*388 4 c# linq entity-framework
我这样回来了IOrderedQueryable<T>:
response.Data = Expressions
.ApplySorts(request, result)
.Skip(request.Skip)
.Take(request.Take)
.ToList();
Run Code Online (Sandbox Code Playgroud)
这是我的类,其中包含一个返回的方法IOrderedQueryable<T>.
public static class Expressions
{
public static IOrderedQueryable<T> ApplySorts<T>(
DataRequest request, IQueryable<T> items)
{
var sorts = request.Sort;
if (sorts != null)
{
foreach (var sort in sorts)
{
items = items.OrderBy(sort.Field + " " + sort.Dir);
}
}
return (IOrderedQueryable<T>)items;
}
}
Run Code Online (Sandbox Code Playgroud)
但在运行时我收到此错误:
{"方法'Skip'仅支持LINQ to Entities中的排序输入.必须在方法'Skip'之前调用'OrderBy'方法."}
请注意,目前没有任何种类; 但是,返回值ApplySorts<T>()仍然应该返回Skip()期望的类型,不是吗?
您需要一个默认排序.虽然在大多数的数据库,你可以做TOP,LIMIT或者BETWEEN不排序,它并没有真正意义的(前两个实际上也适用于Take,但理论是一样的).
返回行的顺序是未定义的(即使它们通常按插入顺序出现).因此,您的ORM阻止您在代码中创建错误(即,Skip不一致,并且没有真正有意义).
进一步解释:Skip(10)没有一个没有意义Order,它在功能上等同于不存在.如果我们没有订购,我们是否跳过10行是无关紧要的.如果你洗牌一副牌,丢弃前10名,然后拿5,是不是只是简单地拿5而不丢弃?在这两种情况下,你都会获得5张随机牌 - 丢弃牌无关紧要.
如果没有提供排序,您应该有一个默认的排序案例.合适的候选者是表的主键.