Lambda表达式组选择最后一个条件

时间:2017-03-07 23:09:21

标签: c# sql-server linq 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为空,它也会获得最后一条记录

任何帮助!!

1 个答案:

答案 0 :(得分: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&gt; 0条件应用两次 - 第一次获得不同的流程ID(具有适当的交易)。第二次为每个流程选择最新交易。

相关问题