就一个IQueryable对象,有没有办法知道它有没有OrderBy过?……

WoooXVi 2012-10-01 10:27:37
就一个IQueryable<T>对象,有没有办法知道它有没有OrderBy过?……

比如:


///分页
publi IQueryable<T> GetPage<T>(IQueryable<T> list, int pagesize, int page){
if(还没排过序呢){
//获取主键
list = list.ordery(r=>r.主键);
}
list = list.skip( (page - 1) * pagesize ).take(pagesize);
}


“还没排过序”,这个有什么办法知道吗?

我现在的笨办法是先让他skip,如果抛出错误,我就去排序。但是这样执行效率就慢了好像
...全文
364 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
ltcszk 2013-11-26
  • 打赏
  • 举报
回复
在查其他问题的时候看到了这个问题,就留个答案吧 其实Linq本身提供了IOrderedQueryable,进行ThenBy或者ThenByDescending的Queryable的返回值就是这个接口类型的 http://msdn.microsoft.com/zh-cn/library/system.linq.iorderedqueryable%28v=vs.110%29.aspx
WoooXVi 2013-03-22
  • 打赏
  • 举报
回复
引用 3 楼 ymf 的回复:
楼主解决了吗?我也正为此问题所困扰
后来就加个参数,人工去判断咯。
鸭梨山大帝 2013-01-25
  • 打赏
  • 举报
回复
"没有经过排序的IQueryable" 为什么要知道他有没经过排序? 基于防呆机制,即使对方告诉你他排序过(by 主键),你的程式就信任吗? 所以你自己已经做了: list = list.ordery(r=>r.主键); 防呆 把这句去掉: if(<span style="color: #FF0000;"><strong>还没排过序呢</strong></span>){ } 就OK
夜色镇歌 2013-01-25
  • 打赏
  • 举报
回复
EntityFramework中 不经过排序,是不能执行Skip 和Take的。。随便按照时间或者ID排下序呗
ymf 2013-01-25
  • 打赏
  • 举报
回复
楼主解决了吗?我也正为此问题所困扰
WoooXVi 2012-10-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

什么样的排序叫做“已经排序”?一个分页代码根本没有排序的职责,排序是调用它的客户程序的职责。设计程序时,如果职责乱了、分不清楚哪些代码应该属于哪一个文件、代码块里提交实现,你的程序就会呈指数速度快速变乱。
[/Quote]


受教了。

但是EntityFramework中,如果不经过排序,没办法执行Skip。

而实际使用中也有很多是没有经过排序的IQueryable就扔进来分页的。所以我只能在这里给它一个默认排序。也是无奈之举。

所以有什么办法吗?
  • 打赏
  • 举报
回复
什么样的排序叫做“已经排序”?一个分页代码根本没有排序的职责,排序是调用它的客户程序的职责。设计程序时,如果职责乱了、分不清楚哪些代码应该属于哪一个文件、代码块里提交实现,你的程序就会呈指数速度快速变乱。

111,093

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧