如何按特定键排序,然后将已排序集合中的第一个结果放入 LINQ 中的组中

How to sort by a specific key and then get the first result in the sorted collection into a group in LINQ

我有一个数据库,我需要从中获取每个用户的最新消息(这意味着我发送的消息或来自我的消息)。我正在使用 LINQ-to-Entities,这是我的查询:

var latestMessageFromEachUser = from m in Database.Messages.Include(m => m.From).Include(m => m.To)
  where !m.IsDeleted && (m.ToID == User.ID || m.FromID == User.ID)
  orderby m.ID descending
  let otherEnd = m.ToID == userId ? m.FromID : m.ToID
  group m by otherEnd into g
  orderby g.FirstOrDefault().ID descending
  select g.FirstOrDefault();

我认为变量名是不言自明的。我按 ID 降序排序,因为它是标识列并且是自动递增的,所以它实际上是按日期排序。但是,当我执行此查询时,我收到每个用户的 oldest 消息,而不是 newest.

为什么?

可能如下所示:

  var test = from m in Database.Messages
             where !m.IsDeleted && (m.ToID == User.ID || m .FromID == User.ID)
             orderby m.ID descending
             let otherEnd = m.ToID == userId ? m.FromID : m.ToID
             group m by otherEnd into g
             select new { g.Key, g.OrderByDescending(n => n.ID).FirstOrDefault() };

我看到的主要问题是对 g.FirstOrDefault().ID 的排序,它按用户获取了第一条分组消息,然后尝试对其进行排序,但实际上什么也做不了

您可以按以下方式进行

    var latestMessageFromEachUser = from m in Database.Messages.Include(m => m.From).Include(m => m.To)
  where !m.IsDeleted && (m.ToID == User.ID || m.FromID == User.ID)  
  let otherEnd = m.ToID == userId ? m.FromID : m.ToID
  group m by otherEnd into g
   orderby m.ID descending
  select g.FirstOrDefault();