2015-11-06 88 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背後的一般想法。 –

相關問題