我需要连接两个表,获取最新的行(一个表上有一个最大ID)。
我有以下表格(和示例数据):
tblParts
PartID
1
2
3
tblPartsVersion
PartVersionID PartID Name
1 1 Hammer v1
2 1 Hammer v2
3 1 Hammer v3
4 2 Screw V1
5 2 Screw V2
6 3 Nail V1
我已经按如下方式构建了SQL查询:
SELECT a.PartVersionID, a.Name
FROM tblPartsVersion a
JOIN tblParts b ON b.PartID = a.PartID
LEFT JOIN tblPartsVersion c ON c.PartID = a.PartID
AND c.PartVersionID > a.PartVersionID
WHERE c.PartVersionID IS NULL
差不多,我得到了我需要的结果:
PartVersionID Name
3 Hammer V3
5 Screw V2
6 Nail V1
我需要一些帮助来尝试将此查询转换为LINQ,并且我很难为它编写正确的代码。
目前我的LINQ查询如下:
var qry = (from a in tblParts
join b in tblPartsVersion ON a.PartID equals b.PartID
select b).ToList()
基本上,从我的LINQ查询中,我需要添加其他连接或where子句条件,但我不知道如何。
寻找一些提示和帮助。感谢。
更新
我已经按照以下方式重新编写了我的查询,它似乎正在按照我的要求检索记录:
var qry1 = from a in tblPartsVersion
group a by a.PartID into grp
select new {MaxID = grp.Max(x => x.PartVersionID), grp.Key };
var qry2 = (from q1 in qry1
join b in tblPartsVersion on q1.MaxID equals b.PartVersionID
join c in tblParts on b.PartID equals c.PartID
select b).ToList();
我想知道这是否是最好的方法呢?我尝试了不同的数据变体,这个查询似乎没问题。
答案 0 :(得分:1)
根本没有理由引用Part表,除非存在部件中不存在的部分版本,并且您不会从该表返回任何内容,因此它使查询更容易(并且更快):
var currentParts=tblPartsVersion
.GroupBy(v=>v.PartID)
.Select(x=>x.OrderByDescending(pv=>pv.PartVersionID).First());
答案 1 :(得分:0)
您需要每个部件的最新版本。为此,您可以按PartID
对其进行分组,并仅保留PartVersionID
最高的那个。
此处似乎没有Join
,除非您需要过滤tblPartsVersion
中但tblParts
中不存在的部分。
var latestParts = tblPartsVersion
.Join(tblParts, version => version.PartID, part => part.PartID, (v, p) => v)
.OrderByDescending(x => x.PartVersionID)
.GroupBy(x => x.PartID)
// if this still doesn't work, uncomment the next line
//.AsEnumerable() //this will pull entire tblPartsVersion from db
.Select(g => g.First());
答案 2 :(得分:0)
您是否需要使用lambda表达式过滤此查询。
像:
var query = (from a in tblParts
join b in tblPartsVersion on a.PartID equals b.PartID
select b)
.GroupBy( c => c.PartID)
.Select( d => d.LastOrDefault()).ToList();