2015-11-06 90 views
0

我想从列表中找到一个记录,该列表应该是列表的MAX(id)。此记录用于在网格视图中显示。LINQ;如何使用连接获得最大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的身份证一名栏,所以我试图像下面

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

但是,这不工作,所以如何做到这一点?请任何人帮忙。

+0

您可以与我们分享一个示例输入和预期输出吗? – Doro

+0

什么是B.BranchName? –

+0

分支是另一个表,所以id与分支表匹配如下===> var Branch = branchService.All()。ToList();在分支上加入B在分支Seq等于B.Id –

回答

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

这将组MasterRenewalMstSeq的项目然后按降序排列,以便First产品的最大的项目由Id顺序每个组值为Id

+0

这不工作@ Juharr ....这里的问题是First()方法不能正常工作 –

+0

如果你正在处理SQL Linq提供程序,那么你可能需要使用'FirstOrDefault' 。 – juharr

+0

@ juharr:运行时不工作,当调试出现在上面给出的行时,它显示以下错误:===>无法执行查询 [select masterrene0_.MASTER_RNW_SEQ as MASTER1_142_,masterrene0_.ROUTE_SEQ as ROUTE2_142_,masterrene0_。 PRODUCT_SEQ为PRODUCT3_142_,masterrene0_.MST_SEQ为MST4_142_,masterrene0_.REQ_SUBMISSION_DATE为REQ5_142_,.................................. .......................... –

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 

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

+0

是的,这是好的,但我需要加载网格数据仅使用连接。请编辑帮助我使用加入@ Ivan Stoev –

+0

@MdAslam为什么你只需要使用连接?如果这样做你想要什么,我不明白为什么它不是一个有效的解决方案。 – juharr

+0

@MdAslam在发布答案后,我意识到它不直接回答标题中定义的问题。但我认为目标是获得预期的结果,而不是如何得到它(假设它不是一种低效率的方式)。这是SQL背后的一般想法。 –

相关问题