IQueryable 查询语句中 OrderByDescending() 扩展方法使用注意点

目的: 查询结构物下所有网关的最新诊断结果.

1. 正确查询 (按诊断时间倒序)

var query = queryDiag.GroupBy(g => new {g.dtuId, g.dtuNo, g.dtuDesp})
                    .Select(s =>
                        s.GroupBy(r => r.diagTime)
                            .Select(e => new
                            {
                                s.Key.dtuId,
                                s.Key.dtuNo,
                                s.Key.dtuDesp,
                                diagTime = e.Key,
                                cpuRatio = e.Where(w => w.diagName == iDAUDiagEntity.CpuRatio)
                                    .Select(l => l.diagResult).FirstOrDefault(),
                                memoryRatio = e.Where(w => w.diagName == iDAUDiagEntity.MemoryRatio)
                                    .Select(l => l.diagResult).FirstOrDefault(),
                                flashRatio = e.Where(w => w.diagName == iDAUDiagEntity.FlashRatio)
                                    .Select(l => l.diagResult).FirstOrDefault(),
                                sdRatio = e.Where(w => w.diagName == iDAUDiagEntity.SdRatio)
                                    .Select(l => l.diagResult).FirstOrDefault(),
                                gatewayWorkDuration = e.Where(w => w.diagName == iDAUDiagEntity.GatewayWorkDuration)
                                    .Select(l => l.diagResult).FirstOrDefault(),
                                serverWorkDuration = e.Where(w => w.diagName == iDAUDiagEntity.ServerWorkDuration)
                                    .Select(l => l.diagResult).FirstOrDefault(),
                                nodesCount = e.Select(l => l.nodesCount).FirstOrDefault()
                            }).OrderByDescending(o => o.diagTime).FirstOrDefault());

查询结果:

结构下每个网关的最新诊断结果.

2. 错误查询 (未实现排序目的)

如果将查询语句中的 ".OrderByDescending()" 调整下位置, 如下代码所示:

var query = queryDiag.GroupBy(g => new {g.dtuId, g.dtuNo, g.dtuDesp})
                    .Select(s =>
                        s.OrderByDescending(o => o.diagTime).GroupBy(r => r.diagTime)
                            .Select(e => new
                            {
                                s.Key.dtuId,
                                s.Key.dtuNo,
                                s.Key.dtuDesp,
                                diagTime = e.Key,
                                cpuRatio = e.Where(w => w.diagName == iDAUDiagEntity.CpuRatio)
                                    .Select(l => l.diagResult).FirstOrDefault(),
                                memoryRatio = e.Where(w => w.diagName == iDAUDiagEntity.MemoryRatio)
                                    .Select(l => l.diagResult).FirstOrDefault(),
                                flashRatio = e.Where(w => w.diagName == iDAUDiagEntity.FlashRatio)
                                    .Select(l => l.diagResult).FirstOrDefault(),
                                sdRatio = e.Where(w => w.diagName == iDAUDiagEntity.SdRatio)
                                    .Select(l => l.diagResult).FirstOrDefault(),
                                gatewayWorkDuration = e.Where(w => w.diagName == iDAUDiagEntity.GatewayWorkDuration)
                                    .Select(l => l.diagResult).FirstOrDefault(),
                                serverWorkDuration = e.Where(w => w.diagName == iDAUDiagEntity.ServerWorkDuration)
                                    .Select(l => l.diagResult).FirstOrDefault(),
                                nodesCount = e.Select(l => l.nodesCount).FirstOrDefault()
                            }).FirstOrDefault());

查询结果:

没有达到预期结果, 可能是最晚的一条诊断记录, 也可能是历史诊断中的某一条记录.

【小结】

IQueryable 查询语句中 OrderByDescending() 扩展方法使用时需注意:

如果需要将结果集按时间倒序排列, 则需要将 "OrderByDescending()" 扩展方法置后.

置前的话, LINQ语句转换后的SQL语句中没有 "order by" 排序条件, 故此, 达不到倒序的效果.

时间: 2024-10-25 15:06:28

IQueryable 查询语句中 OrderByDescending() 扩展方法使用注意点的相关文章

查询语句中select from where group by having order by的执行顺序

查询语句中select from where group by having order by的执行顺序 1.查询中用到的关键词主要包含六个,并且他们的顺序依次为 select--from--where--group by--having--order by 其中select和from是必须的,其他关键词是可选的,这六个关键词的执行顺序 与sql语句的书写顺序并不是一样的,而是按照下面的顺序来执行 from--where--group by--having--select--order by,

mysql查询语句中使用星号真的慢的要死?

前言 之所以写这篇文章,是源于以前看过的关于sql语句优化的帖子,里面明确提到了在sql语句中不要使用 * 来做查询,就像下面的规则中说的 2.尽量避免使用select *,返回无用的字段会降低查询效率.如下: SELECT * FROM t 优化方式:使用具体的字段代替*,只返回使用到的字段. 但是中国有句姥话叫“尽信书不如无书”,难道在sql查询语句中使用星号就真的慢的要死,难道加索引也不行?带着这些个疑问,我进行了一些测试.结果发现,江湖传说未必真的靠得住.那具体测试情况是咋样的呢?下面且

C#中的扩展方法及用途

GPS平台.网站建设.软件开发.系统运维,找森大网络科技!http://cnsendnet.taobao.com来自森大科技官方博客http://www.cnsendblog.com/index.php/?p=476 扩展方法使你能够向现有类型"添加"方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. 以上是msdn官网对扩展方法的描述,现在我通过一个情景例子来对此进行阐释.假设一个控制台程序cla

C#中的扩展方法

在java中没有这样的东西,一个类一旦是 final的 ,这个类就不能再被添加方法, 但是C#能够做到,可以给 sealed 类添加新的方法,这点我还是比较喜欢c#的. 这就是C#中的扩展方法. 那么什么情况下我们才需要去给一个类写扩展方法呢? 系统自带的类型,我们无法去修改: 修改源代码需要较大的精力,而且可能会带来错误: 我们只是需要一个或者较少的几个方法,修改源代码费时费力: 被扩展的类是sealed的,不能被继承:(就算不是sealed的,我们也不能因为需要一个方法而去写一个子类,这样不

记录C#中的扩展方法

C#中的扩展方法. 系统自带的类型,我们无法去修改: 修改源代码需要较大的精力,而且可能会带来错误: 我们只是需要一个或者较少的几个方法,修改源代码费时费力: 被扩展的类是sealed的,不能被继承:(就算不是sealed的,我们也不能因为需要一个方法而去写一个子类,这样不是面向对象) 扩展方法的三个要素: 扩展方法必须处于一个静态类中: 扩展方法必须是一个静态方法: 扩展方法的参数列表必须以 this 开头,this 后面紧跟的是被扩展类,然后才是方法需要的参数:

mysql常用内置函数-查询语句中不能使用strtotime()函数!

来自:http://yushine.iteye.com/blog/775407 FROM_UNIXTIME把 unix时间戳转换为标准时间 unix_timestamp把标准时间转换为 unix时间戳//查询语句中不能使用strtotime()函数!但是可以使用unix_timestamp DATE_FORMAT('1997-10-04 22:23:00','%Y-%m-%d') 格式化时间 如:select FROM_UNIXTIME(pubdate) from article where p

C#中的扩展方法学习总结

??版权声明:本文由秦元培创作和发表,采用署名(BY)-非商业性使用(NC)-相同方式共享(SA)国际许可协议进行许可,转载请注明作者及出处,本文作者为秦元培,本文标题为C#中的扩展方法学习总结,本文链接为http://qinyuanpei.com/2015/12/05/extend-methods-of-csharp/. ??各位朋友大家好,我是秦元培,欢迎大家关注我的博客.最近偶然接触到了C#中的扩展方法,觉得这个语法特性是一个不错的特性,因此决定在这里系统地对C#中的扩展方法相关内容进行下

在C#中使用扩展方法

在我们的编程过程中,会使用各种类库,有自己写的,有的用别人的.当我们使用第三方的类库时,有时候为了使用方便,希望给类库增加一些Helper方法,这时候就要使用扩展方法了. 看看MSDN上的介绍:扩展方法使你能够向现有类型"添加"方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. 通常,建议你只在不得已的情况下才实现扩展方法,并谨慎地实现. 只要有可能,必须扩展现有类型的客户端代码都应该通过创建从现有

objective-C中的扩展方法与partial class

在c#中要扩展一个现有类很容易,比如这样: ? 1 2 3 4 5 6 7 public static class Utils {     public static void PrintToConsole(this string strSrc)     {         Console.WriteLine(strSrc);     }   } 这样就为String类添加了一个PrintToConsole的方法,使用方法如下: ? 1 2 3 4 5 6 7 class MainClass {