【问题标题】:Lambda expression group by select last with a conditionLambda 表达式 group by select last 有一个条件
【发布时间】:2017-03-07 23:09:21
【问题描述】:

使用此代码:

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 为空,它也会让我获得最后一条记录

任何帮助!

【问题讨论】:

    标签: c# sql-server linq lambda


    【解决方案1】:

    分组前移动过滤:

    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(具有适当的事务)。第二次为每个进程选择最新事务。

    【讨论】:

    • @AmrIbrahim 不起作用是什么意思?错误?
    • @AmrIbrahim 我添加了由 EF 生成的查询。您的情况不可能没有应用过滤条件
    猜你喜欢
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多