LINQ加入两个表并获取具有最大ID的行

时间:2015-09-16 17:34:42

标签: c# linq

我需要连接两个表,获取最新的行(一个表上有一个最大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();

我想知道这是否是最好的方法呢?我尝试了不同的数据变体,这个查询似乎没问题。

3 个答案:

答案 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();