首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >LINQ连接两个表并获得具有最大ID的行

LINQ连接两个表并获得具有最大ID的行
EN

Stack Overflow用户
提问于 2015-09-17 01:34:42
回答 3查看 2.3K关注 0票数 0

我需要连接两个表,获取最新的行(一个表具有最大ID )。

我有以下表格(和示例数据):

tblParts

代码语言:javascript
复制
PartID
1
2
3

tblPartsVersion

代码语言:javascript
复制
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查询:

代码语言:javascript
复制
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

很大程度上,我得到了我需要的结果:

代码语言:javascript
复制
PartVersionID Name
3             Hammer V3
5             Screw V2
6             Nail V1

我需要一些帮助来尝试将这个查询转换为LINQ,但我在为它编写正确的代码时遇到了困难。

我目前的LINQ查询如下:

代码语言:javascript
复制
var qry = (from a in tblParts
           join b in tblPartsVersion ON a.PartID equals b.PartID
select b).ToList()

从本质上讲,从我的LINQ查询中,我需要添加其他连接或where子句条件,但我不知道如何添加。

寻找一些提示和帮助。谢谢。

更新:

我重写了我的查询,如下所示,它似乎正在按照我的要求检索记录:

代码语言:javascript
复制
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();

我想知道这是不是最好的方法?我尝试了不同的数据变体,这个查询似乎工作得很好。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-09-17 04:40:39

完全没有理由引用部件表,除非存在部件中不存在的部件版本,并且您没有从该表中返回任何内容,因此它使查询变得更容易(更快):

代码语言:javascript
复制
var currentParts=tblPartsVersion
  .GroupBy(v=>v.PartID)
  .Select(x=>x.OrderByDescending(pv=>pv.PartVersionID).First());
票数 1
EN

Stack Overflow用户

发布于 2015-09-17 01:51:29

您需要每个部件的最新版本。为此,您可以按PartID对它们进行分组,并只保留PartVersionID最高的那个。

这里似乎没有必要使用Join,除非您需要过滤掉存在于tblPartsVersion中但不存在于tblParts中的部分。

代码语言:javascript
复制
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());
票数 0
EN

Stack Overflow用户

发布于 2015-09-17 04:14:43

是否需要使用lambda表达式过滤此查询。

像这样:

代码语言:javascript
复制
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();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32615141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档