使用此代码:
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 :(得分: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(具有适当的交易)。第二次为每个流程选择最新交易。