2017-03-07 142 views
0

與此代碼:Lambda表達式組通過選擇最後一個條件

List<Transaction> list = db.Transaction 
          .GroupBy(t => t.ProcessId) 
          .Select(g => g.OrderByDescending(t => t.TransactionId).FirstOrDefault()) 
          .Where(t => t.xId != null && t.PAmount > 0) 
          .ToList(); 

我試圖讓過去的記錄,其中xId不爲空..分組工作正常..但它讓我最後一次記錄即使xId爲空

任何幫助!

+0

如果將'Where'移到'GroupBy'之前,它會有什麼區別嗎? –

回答

2

分組之前就移動過濾:

db.Transaction 
    .Where(t => t.xId != null && t.PAmount > 0) 
    .GroupBy(t => t.ProcessId) 
    .Select(g => g.OrderByDescending(t => t.TransactionId).FirstOrDefault()) 
    .ToList(); 

因此你會得到每個進程最近交易具有ID和金額大於零。否則,如果最新事務的id等於null,那麼您將完全過濾掉那些流程事務。

EF會生成查詢像

SELECT 
    [Limit1].[TransactionId] AS [TransactionId], 
    [Limit1].[xId] AS [xId], 
    [Limit1].[PAmount] AS [PAmount], 
    [Limit1].[ProcessId] AS [ProcessId] 
    FROM 
    (SELECT DISTINCT 
     [Extent1].[ProcessId] AS [ProcessId] 
     FROM [dbo].[Transactions] AS [Extent1] 
     WHERE ([Extent1].[xId] IS NOT NULL) AND ([Extent1].[PAmount] > 0) 
    ) AS [Distinct1] 
    OUTER APPLY 
    (SELECT TOP (1) 
     [Project2].[TransactionId] AS [TransactionId], 
     [Project2].[xId] AS [xId], 
     [Project2].[PAmount] AS [PAmount], 
     [Project2].[ProcessId] AS [ProcessId] 
     FROM (SELECT 
      [Extent2].[TransactionId] AS [TransactionId], 
      [Extent2].[xId] AS [xId], 
      [Extent2].[PAmount] AS [PAmount], 
      [Extent2].[ProcessId] AS [ProcessId] 
      FROM [dbo].[Transactions] AS [Extent2] 
      WHERE ([Extent2].[xId] IS NOT NULL) AND ([Extent2].[PAmount] > 0) 
        AND ([Distinct1].[ProcessId] = [Extent2].[ProcessId]) 
      ) AS [Project2] 
     ORDER BY [Project2].[TransactionId] DESC 
    ) AS [Limit1] 

正如你可以看到XID NOT NULL和PAmount> 0的條件塗抹兩次 - 第一次得到不同的進程ID(具有適當的交易)。第二次爲每個流程選擇最新的交易時。

+0

試過已經..和分組不起作用 –

+0

@AmrIbrahim你是什麼意思*不起作用*?錯誤? –

+0

找到了答案,謝謝你的幫助 –