【问题标题】:orderby not working to get top 1 result in subquery using LINQorderby 无法使用 LINQ 在子查询中获得前 1 个结果
【发布时间】:2017-11-18 10:45:11
【问题描述】:

我正在尝试使用子查询从子表中获取前 1 个结果。当我尝试使用子查询使用orderby or OrderByDescending 时,它会抛出

NullReferenceException

。不使用orderby or OrderByDescending 我的查询成功执行。 但我想获得子查询的最后一条记录。我的应用已连接到 Mysql 数据库。

下面是我的代码

var result = (from ud in db.user_devices
                          join a in db.access_info on ud.u_id equals a.u_id
                          join d in db.device_num on ud.dev_id equals d.DevId
                          //let pi = db.packet_info.Where(x =>  x.DevId == ud.dev_id && x.DevId != null).OrderByDescending(x =>x.systime).FirstOrDefault()
                          //where  pi != null
                          select new
                          {
                              fuel = db.packet_info.Where(x => x.DevId == ud.dev_id).OrderByDescending(x => x.systime).Select(x => x.fuel).FirstOrDefault(),
                              //removed other fields
                          }).ToList();

【问题讨论】:

  • 您能否提供 db.packet_info 的定义或至少是 systime 属性的类型?
  • 它的数据类型是mysql中的timestamp和C#中的DateTime
  • 系统时间中是否有可能出现空值?
  • 没有空值..我检查过..

标签: c# mysql entity-framework linq linq-to-mysql


【解决方案1】:

使用另一种方式,创建了一个与 linq 具有相同架构的过程。

程序代码如下:

CREATE DEFINER=`abc`@`%` PROCEDURE `spGetAllVechiles`()
BEGIN
    SELECT 

       (SELECT g.fuel  FROM abc.Packet_Info AS g WHERE g.devid = ud.dev_id order by systime desc LIMIT 0,1 ) AS fuel,
       (SELECT  g.fencealarm FROM abc.Packet_Info AS g WHERE g.devid = ud.dev_id order by systime desc LIMIT 0,1 ) AS fencealarm,
       (SELECT  g.speed  FROM abc.Packet_Info AS g WHERE g.devid = ud.dev_id order by systime desc LIMIT 0,1 ) AS speed,
       (SELECT  g.Latitude FROM abc.Packet_Info AS g WHERE g.devid = ud.dev_id order by systime desc LIMIT 0,1 ) AS Latitude,
       (SELECT  g.Longitude FROM abc.Packet_Info AS g WHERE g.devid = ud.dev_id order by systime desc LIMIT 0,1 ) AS Longitude
       //other params...

    FROM abc.access_info AS ac 
    INNER JOIN abc.user_devices AS ud ON ud.u_id = ac.u_id
    INNER JOIN abc.device_num AS dn ON dn.DevId = ud.dev_id;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多