LINQ 查询添加 orderby 使 Skip 和 Take 不起作用 Linqpad

Posted

技术标签:

【中文标题】LINQ 查询添加 orderby 使 Skip 和 Take 不起作用 Linqpad【英文标题】:LINQ query adding orderby makes Skip and Take not work Linqpad 【发布时间】:2014-02-11 18:21:17 【问题描述】:

我想使用 Skip 和 Take 进行分页,但我也想使用 orderby

没有 Skip and Take,使用 LinqPad 我可以执行以下操作,这适用于 orderby

var query = from m in Orders
            orderby m.ID descending
            select m;
query.Dump();

但是,如果我保留 orderby,那么这将失败

query = query.Skip(1 + 10).Take(10);
query.Dump();

我删除 orderby 并且它可以工作,但我想要 orderby ....

var query = from m in Orders
    select m;   
query = query.Skip(1 + 10).Take(10);            
query.Dump();

【问题讨论】:

你说的失败是什么意思? 【参考方案1】:

发生错误,因为您在第一次查询后使用var 和编译器推断query 类型为IOrderedEnumerable<T>,并且您尝试使用Skip/Take 调用将IEnumerable<T> 分配给它:

不能隐式转换类型 'System.Collections.Generic.IEnumerable<Order>' 到 'System.Linq.IOrderedEnumerable<Order>'。存在显式转换 (你错过了演员表吗?)

如果您在开头输入queryIEnumerable<T>,一切都会正常工作

IEnumerable<Order> query = from m in Orders
                           orderby m.ID descending
                           select m;

query = query.Skip(10).Take(10);

【讨论】:

我不知道为什么我什至在做 query = query。 ...我必须更喜欢这种风格 var query = (from m in Orders orderby m.ID 升序选择 m).Skip(1 + 10).Take(10);查询.转储();【参考方案2】:

选择的答案是正确的,但是如果您没有绑定到具有类型顺序的模型,那么这将起作用

MarcinJuraszek 是正确的。

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable&lt;Order&gt;' to 'System.Linq.IOrderedEnumerable&lt;Order&gt;'. An explicit conversion exists (are you missing a cast?)

你会以你的方式得到那个错误

但不必使用IEnumerable&lt;Order&gt; ...

var query = (from m in Orders
        orderby m.ID descending
        select m).Skip(10).Take(10);
query.Dump();

当我知道我想跳过第一条记录时,我在 LINQPAD 中遇到了同样的问题

所以对我来说:

 var comments = (from c in ESO_tblComments
                         .Where(d => d.TblTipsId == 10312)   
                orderby c.Id ascending
                select c).Skip(1);

【讨论】:

【参考方案3】:

更多。无论您是否使用它,您都可以对查询进行排序,而无需升序或降序样式。你可以使用下面的代码。

 var comments = (from c in ESO_tblComments
                     .Where(d => d.TblTipsId == 10312)
            select c).OrderBy(xx=>1==1).Skip(1);

【讨论】:

以上是关于LINQ 查询添加 orderby 使 Skip 和 Take 不起作用 Linqpad的主要内容,如果未能解决你的问题,请参考以下文章

分页错误:仅 LINQ to Entities 中的排序输入支持“跳过”方法。方法 'OrderBy' 必须在方法 'Skip' 之前调用

在 linq 查询中设置动态排序名称字段

使用 Linq Skip Take 进行传统 SQL 查询,而不是使用 RowNum

我的linq查询只是拉动它需要的东西还是所有东西?

关于Linq to Sql的分页

Linq 到实体 Skip() 和 Take()