2017-03-07 34 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

找到了答案,谢谢你的帮助 –