Lambda表达式组通过选择最后一个条件
与此代码: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
为空
任何帮助!
分组之前就移动过滤:
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你是什么意思*不起作用*?错误? –
找到了答案,谢谢你的帮助 –
如果将'Where'移到'GroupBy'之前,它会有什么区别吗? –