IQueryable 查询语句中 OrderByDescending() 扩展方法使用注意点
2016-01-11 19:58
661 查看
目的: 查询结构物下所有网关的最新诊断结果.
1. 正确查询 (按诊断时间倒序)
查询结果:
结构下每个网关的最新诊断结果.
2. 错误查询 (未实现排序目的)
如果将查询语句中的 ".OrderByDescending()" 调整下位置, 如下代码所示:
查询结果:
没有达到预期结果, 可能是最晚的一条诊断记录, 也可能是历史诊断中的某一条记录.
【小结】
IQueryable 查询语句中 OrderByDescending() 扩展方法使用时需注意:
如果需要将结果集按时间倒序排列, 则需要将 "OrderByDescending()" 扩展方法置后.
置前的话, LINQ语句转换后的SQL语句中没有 "order by" 排序条件, 故此, 达不到倒序的效果.
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" 排序条件, 故此, 达不到倒序的效果.
相关文章推荐
- iOS动画之iOS UIBezierPath类 介绍
- UI组件之TextView及其子类(三)ToggleButton和Switch
- UITextField - 常用属性及设置
- UI课程(1.Control,2.Switch开关 ,3.slider滑动器,4.SegmentedControl分段)
- android运行时显示finished with non-zero exit value 1和finished with non-zero exit value 2
- 手机蓝牙对应的各类服务对应的UUID(常用已通过验证的几个)
- IOS(UI)_AutoLayout(自动布局)_01
- 【POJ】 2031 Building a Space Station
- ReferenceQueue的使用
- Android系统之路(初识MTK) ------ System-Bluetooth name/WiFi AP name/sleep add never/Notification popup
- UIView 动画
- ERROR! The server quit without updating PID file
- UI基本控件
- Visual Studio中的Build和Rebuild区别
- 显示 隐藏 tabbar的方法(环信UI中使用的)
- 自动调节自号大小UIlabel 自适应字号
- iOS UI-静态单元格与动态单元格
- uiautomator基本操作命令
- UINavigationBar-设置
- Windows 10家庭版也能共享打印机(上)启用Guest账户