LINQ选择分组依据后具有最大值的行

LINQ选择分组依据后具有最大值的行,linq,ef-core-3.1,Linq,Ef Core 3.1,我有以下sql语句: Select tsl.Transaction_Id, tsl.State_Id, MAX(tsl."Timestamp") from TransactionStatesLog tsl group by tsl.Transaction_Id 如何将此语句翻译为LINQ?我只想选择整行,其中Timestamp是组的最大值 var states = (from logs in _context.TransactionStatesLo

我有以下sql语句:

Select 
   tsl.Transaction_Id, 
   tsl.State_Id,
   MAX(tsl."Timestamp") 
from TransactionStatesLog tsl 
group by tsl.Transaction_Id
如何将此语句翻译为LINQ?我只想选择整行,其中Timestamp是组的最大值

var states = (from logs in _context.TransactionStatesLog
              group logs by new { logs.TransactionId } into g
              select new
              {
                  TransactionId = g.Key,
                  Timestamp = g.Max(x => x.Timestamp)
              }).ToList();
使用此代码,我可以从组中选择
TransactionId
和max
Timestamp

var states = (from logs in _context.TransactionStatesLog
              group logs by new { logs.TransactionId } into g
              select new
              {
                  TransactionId = g.Key,
                  Timestamp = g.Max(x => x.Timestamp)
              }).ToList();

我正在使用ef core 3.1,假设您忘记将
tsl.State\u Id
作为分组键添加到SQL中,如下所示(否则SQL也无法工作):

如果我理解正确,您还需要将
StateId
添加到分组语句中,以便能够选择
StateId
TransactionId

因此,这应该是可行的:

var states = (from logs in _context.TransactionStatesLog
              group logs by new { logs.TransactionId, logs.StateId } into g
              select new
              {
                  TransactionId = g.Key.TransactionId,
                  StateId = g.Key.StateId,
                  Timestamp = g.Max(x => x.Timestamp)
              }).ToList();

请参阅:

我看不出SQL将如何工作,因为
tsl.State\u Id
不是group by的一部分。这是Sqlite,对吗?它允许Select中的字段与分组字段处于相同的聚合级别。但是LINQ和EF的翻译不允许这样做,因此您必须向分组键添加
State\u Id
,如所回答的。