Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用LINQ在用户中获取最后的消息?_C#_.net_Linq - Fatal编程技术网

C# 如何使用LINQ在用户中获取最后的消息?

C# 如何使用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

我有一个表,显示了消息之间的关系。像这样:

我想从每个用户那里得到最后一条消息。例如,结果将是表中的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,
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分组,按日期降序排列每个键的项目列表,然后选择第一个?