C# 如何使用LINQ在用户中获取最后的消息?
我有一个表,显示了消息之间的关系。像这样: 我想从每个用户那里得到最后一条消息。例如,结果将是表中的ID91和ID92C# 如何使用LINQ在用户中获取最后的消息?,c#,.net,linq,C#,.net,Linq,我有一个表,显示了消息之间的关系。像这样: 我想从每个用户那里得到最后一条消息。例如,结果将是表中的ID91和ID92 var messages=await\u dbContext.messages.Include(x=>x.User)。其中(x=>x.SenderId==userId | x.ReceiveId==userId)。OrderByDescending(x=>x.CreatedAt)。选择(x=>newmessage{ Id=x.Id, Content=x.Content, Cr
var messages=await\u dbContext.messages.Include(x=>x.User)。其中(x=>x.SenderId==userId | x.ReceiveId==userId)。OrderByDescending(x=>x.CreatedAt)。选择(x=>newmessage{
Id=x.Id,
Content=x.Content,
CreatedAt=x.CreatedAt,
用户=新用户{
Id=x.User.Id,
UserName=x.User.UserName,
Name=x.User.Name,
LastName=x.User.LastName,
profile=x.User.profile
},
}).Distinct().ToListAsync();
我该怎么做?答案是:EF不支持的窗口函数。所以只需编写SQL并通过Dapper运行它
SELECT
s.Id,
s.SenderId,
s.ReceiveId,
s.Content,
s.CreatedAt
FROM
(
SELECT
m.Id,
m.SenderId,
m.ReceiveId,
m.Content,
m.CreatedAt,
ROW_NUMBER() OVER (PARTITION BY m.ReceiveId ORDER BY m.CreatedAt DESC) AS RN
FROM Messages m
) s
WHERE s.RN = 1
其他解决方案只是权宜之计。这是我第三次建议你是否需要LINQ来完成这样的任务
var query = from m in Messages
select new
{
m.Id,
m.SenderId,
m.ReceiveId,
m.Content,
m.CreatedAt,
RN = Sql.Ext.RowNumber().Over().PartitionBy(m.ReceiveId).OrderByDesc(m.CreatedAt).ToValue()
}
var messageQuery =
from m in query
where m.RN == 1
select new
{
m.Id,
m.SenderId,
m.ReceiverId,
m.Content,
m.CreatedAt,
}
// switch to alternative LINQ Translator
messageQuery = messageQuery.ToLinqToDB();
那么你的意思是按senderid、receiverid分组,按日期降序排列每个键的项目列表,然后选择第一个?