如何按特定键排序,然后将已排序集合中的第一个结果放入 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();
我有一个数据库,我需要从中获取每个用户的最新消息(这意味着我发送的消息或来自我的消息)。我正在使用 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();