LINQ;如何使用join获取max Id的记录?

时间:2015-11-06 12:48:35

标签: c# oracle linq join nhibernate

我想从列表中找到一条应该是列表的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()

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

2 个答案:

答案 0 :(得分:3)

我认为你不需要加入。一个简单的子查询就足够了,现在数据库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

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

答案 1 :(得分:2)

我认为你想要的是以下

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的值。