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>
'。存在显式转换 (你错过了演员表吗?)
如果您在开头输入query
为IEnumerable<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<Order>' to 'System.Linq.IOrderedEnumerable<Order>'. An explicit conversion exists (are you missing a cast?)
你会以你的方式得到那个错误
但不必使用IEnumerable<Order>
...
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' 之前调用