C# 林克;如何使用join获取最大Id的记录?

C# 林克;如何使用join获取最大Id的记录?,c#,oracle,linq,join,nhibernate,C#,Oracle,Linq,Join,Nhibernate,我想从列表中找到一条记录,它应该是列表的最大值(id)。此记录用于在栅格视图中显示 var cacheProducts = nettingOffAudService.All().TOList(); Product product = productService.FindBy(x => x.ProductName == "NETOFF"); var MasterRenewal = masterRenewalAudService.All().Where(x => x.Prod

我想从列表中找到一条记录,它应该是列表的最大值(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()
  };
   join MR in MasterRenewal on p.Id equals MR.MstSeq into MRRenewal
   from MR in MRRenewal.Max(x=>x.Id).First().DefaultIfEmpty()
如果MasterRenewal包含多个具有相同MstSeq的记录,那么我希望获取最后生成的记录,即MAX(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()
  };
   join MR in MasterRenewal on p.Id equals MR.MstSeq into MRRenewal
   from MR in MRRenewal.Max(x=>x.Id).First().DefaultIfEmpty()

但这不起作用,那么怎么做呢?请任何人帮忙。

我想你想要的是以下内容

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()
...

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

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()
...

这将通过
MstSeq
MasterRenewal
中的项目进行分组,然后通过
Id
按降序对每个组进行排序,这样
第一个
项目就是
Id
最大值的项目,我认为您不需要加入。一个简单的子查询就足够了,现在数据库SQL优化器可以轻松地将它们转换为连接(如果需要)

所以我建议用这样的方法

// ...
from p in cacheProducts 
let MR = MasterRenewal.Where(r => r.MstSeq == p.Id).OrderByDescending(r => r.Id).FirstOrDefault()
// the rest
更新:这里与join相同

// ...
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

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

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

所以我建议用这样的方法

// ...
from p in cacheProducts 
let MR = MasterRenewal.Where(r => r.MstSeq == p.Id).OrderByDescending(r => r.Id).FirstOrDefault()
// the rest
更新:这里与join相同

// ...
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


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

你能用一个示例输入和预期输出与我们分享吗?什么是
B.BranchName
?Branch是另一个表,因此id与分支表匹配,如下==>var branch=branchService.All().ToList();在p.BranchSeq等于B的分支中连接B。考虑两个表,即NetOff和Renewal。我想从NetOff表中获取所有记录,并将其与续订表的MstSeq和ProductSeq列连接起来。这里ProductSeq是相同的值,但MstSeq包含不同的值。MstSeq也可以是重复的。这里我的输出是:如果MstSeq在续订表中包含重复项,那么我想获取最大id记录。@多罗。如果您知道答案,请帮助我。您可以与我们分享一个输入和预期输出示例吗?什么是
B.BranchName
?Branch是另一个表,因此id与Branch表匹配,如下===>var Branch=branchService.All().ToList();在p.BranchSeq等于B的分支中连接B。考虑两个表,即NetOff和Renewal。我想从NetOff表中获取所有记录,并将其与续订表的MstSeq和ProductSeq列连接起来。这里ProductSeq是相同的值,但MstSeq包含不同的值。MstSeq也可以是重复的。这里我的输出是:如果MstSeq在续订表中包含重复项,那么我想获取最大id记录。@多罗。如果您知道答案,请帮助我是的,这是可以的,但我只需要使用join加载网格数据。请编辑并帮助我使用join@Ivan进行编辑Stoev@MdAslam为什么只需要使用“联接”?如果这是您想要的,我不明白为什么它不是一个有效的解决方案。@MdAslam发布答案后,我意识到它没有直接回答标题中定义的问题。但我认为目标是获得预期的结果,而不是如何获得(假设这不是一种低效的方式)。这是SQL背后的一般想法。@Ivan您的帖子只是一个有效的解决方案,但我想获得NetOff表的每条记录与Renewal表连接。因为如果NetOff包含一些记录,而续订表为空,则代码不起作用。@MdAslam
Where(r=>r.MstSeq==p.Id)
执行“连接”。Join是一种语法糖,用于匹配两个表字段以实现相等。是的,这是可以的,但我只需要使用Join加载网格数据。请编辑并帮助我使用join@Ivan进行编辑Stoev@MdAslam为什么只需要使用“联接”?如果这是您想要的,我不明白为什么它不是一个有效的解决方案。@MdAslam发布答案后,我意识到它没有直接回答标题中定义的问题。但我认为目标是获得预期的结果,而不是如何获得(假设这不是一种低效的方式)。这是SQL背后的一般想法。@Ivan您的帖子只是一个有效的解决方案,但我想获得NetOff表的每条记录与Renewal表连接。因为如果NetOff包含一些记录,而续订表为空,则代码不起作用。@MdAslam
Where(r=>r.MstSeq==p.Id)
执行“连接”。Join是一种语法糖,用于匹配两个表字段以实现相等。这不起作用@Juharr…这里的问题是First()方法不能正常工作。如果您处理的是SQL Linq提供程序,则可能需要使用
FirstOrDefault
。@Juharr:它不起作用,运行时,当debug出现在给定行上方时,它会显示以下错误:=>无法执行查询[选择masterrene0。MASTER。RNW?SEQ作为MASTER1?142?选择masterrene0。ROUTE?SEQ作为ROUTE2?142?选择masterrene0。PRODUCT?SEQ作为PRODUCT3?142?选择masterrene0。MST?SEQ作为MST4?142?选择masterrene0?ROUTE?SEQ作为ROUTE2?选择masterrene0。ROUTE?选择masterrene0。PRODUCT?SEQ作为PRODUCT3?选择masterrene0?选择masterrene0。MST?SEQ作为MST442?选择masterrene0?提交日期作为REQ5?142?选择masterrene0?错误发生在“UniqueMasterRene0”上variableThis不起作用@Juharr….这里的问题是First()方法不能正常工作。如果您处理的是SQL Linq提供程序,那么您可能需要使用
FirstOrDefault
。@Juharr:它在运行时和上面的调试启动时不起作用