LINQ查询添加orderby使得Skip和Take不能正常运行Linqpad

时间:2014-01-21 22:21:49

标签: c# linq linq-to-sql

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

没有Skip和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();

3 个答案:

答案 0 :(得分:14)

发生错误,因为您在第一次查询后使用var和编译器推断query类型为IOrderedEnumerable<T>,并且您尝试使用{IEnumerable<T>向其分配Skip {1}} / Take来电:

  

无法隐式转换类型   '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);

答案 1 :(得分:1)

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

MarcinJuraszek是对的。

Rectangle rect = new Rectangle(0, 0, 160, 90); Label cutOutText = new Label("YAY"); rect.setFill(Color.RED); rect.setInverseClip(cutOutText);

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

但不必使用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>

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

所以对我来说:

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

答案 2 :(得分:1)

了解更多。如果您使用或不使用它,您可以不按升序或降序排序您的查询。你可以使用下面的代码。

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