分組之前就移動過濾:
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(具有適當的交易)。第二次爲每個流程選擇最新的交易時。
如果將'Where'移到'GroupBy'之前,它會有什麼區別嗎? –