为什么我不能在IOrderedQueryable上调用Skip?

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()期望的类型,不是吗?

Rob*_*Rob 8

您需要一个默认排序.虽然在大多数的数据库,你可以做TOP,LIMIT或者BETWEEN不排序,它并没有真正意义的(前两个实际上也适用于Take,但理论是一样的).

返回行的顺序是未定义的(即使它们通常按插入顺序出现).因此,您的ORM阻止您在代码中创建错误(即,Skip不一致,并且没有真正有意义).

进一步解释:Skip(10)没有一个没有意义Order,它在功能上等同于不存在.如果我们没有订购,我们是否跳过10行是无关紧要的.如果你洗牌一副牌,丢弃前10名,然后拿5,是不是只是简单地拿5而不丢弃?在这两种情况下,你都会获得5张随机牌 - 丢弃牌无关紧要.

如果没有提供排序,您应该有一个默认的排序案例.合适的候选者是表的主键.