2017-06-15 5 views
0

サブクエリを使用して子テーブルから上位1つの結果を取得しようとしています。私は、サブクエリを使用してorderby or OrderByDescendingを使用しようとすると、それはorderbyはLINQを使用してサブクエリでトップ1の結果を得るために働いていません

とNullReferenceException

をスローします。 orderby or OrderByDescendingを使用しないと、my queryが正常に実行されます。 しかし、私はサブクエリの最後のレコードを取得したい。私のアプリは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(); 
+0

あなたはdb.packet_infoまたはプロパティSYSTIMEの少なくとも型の定義を提供していただけますか? –

+0

そのデータ型はC#のmysqlとDateTimeのタイムスタンプです –

+0

systimeにnullがある可能性はありますか? –

答えて

0

下に与える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; 
関連する問題