1

J'ai besoin nhiberante requête (non HQL) équivalente SQL suivante:groupe NHibernate par et rejoindre requête

SELECT ur.* 
FROM (SELECT MAX(requestTime) rt, macAddress ma 
    FROM UpdateRequests 
    GROUP BY macAddress) mur 
JOIN dbo.UpdateRequests ur 
ON mur.ma = ur.macAddress AND mur.rt = ur.requestTime 

J'ai eu pas de chance avec d'autres exemples similaires sur stackoverflow. Avoir un mappage UpdateRequest, il semble que ce n'est pas possible avec l'API Query, qu'en est-il de QueryOver?

+0

Vous ne pouvez pas interroger à partir de tables dérivées avec QueryOver, donc cette requête * exact * n'est pas possible. Cependant, je pense que cela pourrait être réécrit avec une sous-requête, est-ce une solution de contournement acceptable? –

Répondre

1

Enfin un Guru m'a suggéré de changer requête SQL sans modifier le plan d'exécution:

SELECT ur.* 
FROM [dbo].[UpdateRequests] AS ur 
WHERE ur.[RequestTime] = (SELECT MAX(mur.[RequestTime]) 
          FROM [dbo].[UpdateRequests] mur 
          WHERE mur.[MacAddress] = ur.[MacAddress]) 

Donc, dans le code, il se transforme en:

session 
    .Query<UpdateRequest>() 
    .Where(ur => ur.RequestTime == session.Query<UpdateRequest>() 
              .Where(mur => mur.MacAddress == ur.MacAddress) 
              .Max(mur => mur.RequestTime)) 
    .ToList(); 

Et c'est exactement ce que je dois.

+1

Je suis content que vous l'ayez fait fonctionner, +1 –