【问题标题】:LINQ; how to get a record with max Id using join?LINQ;如何使用加入获取具有最大 ID 的记录?
【发布时间】:2015-11-06 12:48:34
【问题描述】:

我想从列表中找到一条记录,该记录应该是列表的 MAX (id)。此记录用于在网格视图中显示。

 var cacheProducts = nettingOffAudService.All().TOList();

 Product product = productService.FindBy(x => x.ProductName == "NETOFF");

 var MasterRenewal = masterRenewalAudService.All().Where(x => x.ProductSeq == product.Id ).ToList(); 

这里我想将 MasterRenewal 的一列与 cacheProducts 的 Id 匹配,所以我尝试如下

var jsonData = new
 {
     total = totalPages,
            page = page,
            records = totalRecords,
            rows = (
        from p in cacheProducts 
        join MR in MasterRenewal on p.Id equals MR.MstSeq into MRRenewal
        from MR in MRRenewal.DefaultIfEmpty()

                select new
                {
                    cell = new Object[] 
                    { 
                        p.Id.ToString(),  
                        B.BranchName,
                        p.AccountNumber,
                        p.ClientName,
                        MR==null?"":((enumRecStatusMasterRenewal)MR.RecordStatus).GetDescriptionEnum(),
                        p.Status.GetStatusString(),
                    }
                }).ToArray()
  };

如果 MasterRenewal 包含多个具有相同 MstSeq 的记录,那么我想取最后生成的记录,即 MAX (id)。为此,我尝试如下

   join MR in MasterRenewal on p.Id equals MR.MstSeq into MRRenewal
   from MR in MRRenewal.Max(x=>x.Id).First().DefaultIfEmpty()

但这不起作用,那么如何做到这一点?请任何人帮忙。

【问题讨论】:

  • 您能与我们分享一个示例输入和预期输出吗?
  • 什么是B.BranchName
  • Branch 是另一个表,所以 id 与分支表匹配如下 ===> var Branch = branchService.All().ToList();在 p.BranchSeq 上的 Branch 中加入 B 等于 B.Id
  • 考虑两个表,即 NetOff 和 Renewal。我想从 NetOff 表中获取所有记录,加入 Renewal 表的 MstSeq 和 ProductSeq 列。这里 ProductSeq 是相同的值,但 MstSeq 包含不同的值。而且 MstSeq 也可以是重复的。这里我的输出是:如果 MstSeq 在 Renewal 表中包含重复项,那么我想获取最大 id 记录。 @多罗。如果你知道答案,请帮助我

标签: c# oracle linq join nhibernate


【解决方案1】:

我认为您想要的是以下内容

var uniqueMasterRenewal = MasterRenewal.GroupBy(mr => mr.MstSeq)
    .Select(grp => grp.OrderByDescending(mr => mr.Id).FirstOrDefault());

from p in cacheProducts 
join MR in uniqueMasterRenewal on p.Id equals MR.MstSeq into MRRenewal
from MR in MRRenewal.DefaultIfEmpty()
...

这会将MasterRenewal 中的项目按MstSeq 分组,然后按Id 以降序对每个组进行排序,以便First 项目是Id 最大值的项目。

【讨论】:

  • 这不起作用@Juharr....这里的问题是 First() 方法无法正常工作
  • 如果您使用的是 SQL Linq 提供程序,那么您可能需要改用 FirstOrDefault
  • @ juharr:它不工作,在运行时,当调试出现在上面给出行时,它显示以下错误:===> 无法执行查询 [选择 masterrene0_.MASTER_RNW_SEQ 作为 MASTER1_142_,masterrene0_。 ROUTE_SEQ 作为 ROUTE2_142_,masterrene0_.PRODUCT_SEQ 作为 PRODUCT3_142_,masterrene0_.MST_SEQ 作为 MST4_142_,masterrene0_.REQ_SUBMISSION_DATE 作为 REQ5_142_,...................... ................................
  • “uniqueMasterRenewal”变量出现错误
【解决方案2】:

我认为您不需要加入。一个简单的子查询就足够了,现在的数据库 SQL 优化器可以在需要时轻松地将它们转换为连接。

所以我建议使用类似的东西

// ...
from p in cacheProducts 
let MR = MasterRenewal.Where(r => r.MstSeq == p.Id).OrderByDescending(r => r.Id).FirstOrDefault()
// the rest

更新:这里与加入相同

// ...
from p in cacheProducts
join MR in MasterRenewal on p.Id equals MR.MstSeq into MRRenewal
let MR = MRRenewal.OrderByDescending(r => r.Id).FirstOrDefault()
// the rest

我不知道你为什么坚持使用连接,我已经在相似的关系上测试了这两种变体,它们产生了相同的结果(使用左外连接语义)。

【讨论】:

  • 是的,这没关系,但我只需要使用连接来加载网格数据。请编辑帮助我使用加入@Ivan Stoev 来完成此操作
  • @MdAslam 为什么只需要使用 join?如果这符合您的要求,我不明白为什么它不是有效的解决方案。
  • @MdAslam 发布答案后,我意识到它并没有直接回答标题中定义的问题。但我认为目标是获得预期的结果,而不是如何获得它(假设这不是一种低效的方式)。这是 SQL 背后的总体思路。
  • @Ivan 您的帖子只是一个有效的解决方案,但我想将 NetOff 表的每条记录与 Renewal Table 连接起来。因为如果 NetOff 包含一些记录并且 Renewal 表为空,那么您的代码将无法正常工作。
  • @MdAslam Where(r => r.MstSeq == p.Id) 执行“加入”。 Join 是一种语法糖,用于匹配两个表字段是否相等。
猜你喜欢
  • 2011-04-23
  • 2016-05-25
  • 1970-01-01
  • 2016-09-24
  • 2012-05-16
  • 2021-01-20
  • 1970-01-01
  • 2010-09-23
  • 2018-07-12
相关资源
最近更新 更多