我试图将SQL查询转换为linq,但我仍然坚持将group by和max()结合起来

时间:2011-08-15 17:23:58

标签: sql linq

我要做的是找到表中每个SerialNumber列的最后一个ID键列。

这是示例表,截断到我需要回答此问题的列。

Devices Table
SerialNumber
12345
45678
67890

History Table
ID | SerialNumber
1  | 12345
2  | 45678
3  | 67890
4  | 12345
5  | 67890

我的预期输出是:

ID | SerialNumber
2  | 45678
4  | 12345
5  | 67890

这是我试图转换的SQL:

SELECT max(ID) as ID, SerialNumber
FROM History
WHERE SerialNumber in
 (SELECT Distinct SerialNumber
 FROM Devices
 WHERE DeviceType = 0)
GROUP BY SerialNumber)

这是我得到的最好的linq查询:

var query= from ListOfIDs in History
           where (from distinctSerialNubers in Devices
           where distinctSerialNubers.DeviceType == 0
           select distinctSerialNubers.SerialNumber).Contains(ListOfIDs.SerialNumber)
           select new {ListOfIDs.ID, ListOfIDs.SerialNumber};

使用.Max()将返回History表中的最后一个ID。尝试按ListOfIDs.SerialNumber对ListOfID进行分组将使用SerialNumber分隔所有ID,但我似乎找不到进入组运行的方法.Max()。

编辑: 谢谢你的答案。这两个答案的组合对我很有用。

var query= from historyEntry in History
where (from s in Devices where s.DeviceType==0 select s.SerialNumber).Contains(historyEntry.SerialNumber)
group historyEntry by historyEntry.SerialNumber into historyGroup
select historyGroup.Max(entry => entry.ID);

谢谢你们两位,我一直在努力想出这一天。

2 个答案:

答案 0 :(得分:1)

没有编译/测试过,但这应该是你正在寻找的东西:

from historyEntry in db.History
join device in db.Devices on history.SerialNumber equals device.SerialNumber
where device.DeviceType == 0
group historyEntry by historyEntry.SerialNumber into historyGroup
select new { ID = historyGroup.Max(entry => entry.ID), SerialNumber = historyGroup.Key }

答案 1 :(得分:0)

怎么样:

var snoQuery = (from s in Devices where s.DeviceType==0 select s.SerialNumber).Distinct();

var query (
   from h in History 
   where snoQuery.Contains(h.SerialNumber)
   group h by h.SerialNumber into results
   select new { Id = results.Max(r=>r.id) , SerialNumber = results.Key}
);