我要做的是找到表中每个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);
谢谢你们两位,我一直在努力想出这一天。
答案 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}
);