gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:30:34 26 4
gpt4 key购买 nike

我要返回一个 IOrderedQueryable<T>像这样:

response.Data = Expressions
.ApplySorts(request, result)
.Skip(request.Skip)
.Take(request.Take)
.ToList();

这是我的类,它包含一个返回 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;
}
}

但是在运行时我得到这个错误:

{"The method 'Skip' is only supported for sorted input in LINQ to Entities. The method 'OrderBy' must be called before the method 'Skip'."}

请注意,当前没有排序;但是,ApplySorts<T>() 的返回值应该仍然返回 Skip() 的类型期待,不是吗?

最佳答案

您需要一个默认排序。虽然在大多数数据库中,您可以在不排序的情况下执行 TOPLIMITBETWEEN,但这并不真的 sense(前两个实际上适用于Take,但理论是一样的)。

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

进一步解释:Skip(10) 没有 Order 就没有意义,它在功能上等同于不存在。如果我们没有排序,我们是否跳过 10 行是无关紧要的。如果你洗一副牌,弃掉前10张,然后取5张,这和只取5张不弃有什么区别吗?在这两种情况下,您都会随机获得 5 张牌 - 弃牌无关紧要。

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

关于c# - 为什么我不能在 IOrderedQueryable 上调用 Skip?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34952285/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com