如何使用 LINQ 对两个可能字段之一进行分组?
How do I group on one of two possible fields using LINQ?
我正在尝试获取与给定用户的最新联系方式,按用户分组:
public class ChatMessage
{
public string SentTo { get; set; }
public string SentFrom { get; set; }
public string MessageBody { get; set; }
public string SendDate { get; set; }
}
用户的联系信息可以在 SentTo
或 SentFrom
中。
List<ChatMessage> ecml = new List<ChatMessage>();
var q = ecml.OrderByDescending(m => m.SendDate).First();
会给我最新消息,但我需要每个用户的最后一条消息。
我能找到的最接近的解决方案是 LINQ Max Date with group by,但我似乎无法找出正确的语法。如果不需要,我宁愿不创建多个 List 对象。
如果用户的信息在 SentTo
中,我的信息将在 SentFrom
中,反之亦然,所以我确实有一些方法可以检查用户的数据在哪里。
我有没有提到我是 LINQ 的新手?任何帮助将不胜感激。
应该很简单,看这段代码:
string username = "John";
var q = ecml.Where(i=>i.SentFrom == username || i.SentTo == username).OrderByDescending(m => m.SendDate).First();
它只是过滤您的 collection,选择 SentFrom 或 SentTo 等于 username
的项目。
由于您需要将每条记录解释两次 - 即作为 SentTo
和 SentFrom
,查询变得有点棘手:
var res = ecml
.SelectMany(m => new[] {
new { User = m.SentFrom, m.SendDate }
, new { User = m.SentTo, m.SendDate }
})
.GroupBy(p => p.User)
.Select(g => new {
User = g.Key
, Last = g.OrderByDescending(m => m.SendDate).First()
});
关键技巧在 SelectMany
,它使每个 ChatMessage
项目成为两个匿名项目 - 一个将 SentFrom
用户与 SendDate
配对,另一个将 SentTo
用户与同一日期配对。
一旦您在可枚举中拥有两条记录,剩下的就很简单了:按用户分组,然后将 post 中的查询应用于每个组。
我正在尝试获取与给定用户的最新联系方式,按用户分组:
public class ChatMessage
{
public string SentTo { get; set; }
public string SentFrom { get; set; }
public string MessageBody { get; set; }
public string SendDate { get; set; }
}
用户的联系信息可以在 SentTo
或 SentFrom
中。
List<ChatMessage> ecml = new List<ChatMessage>();
var q = ecml.OrderByDescending(m => m.SendDate).First();
会给我最新消息,但我需要每个用户的最后一条消息。
我能找到的最接近的解决方案是 LINQ Max Date with group by,但我似乎无法找出正确的语法。如果不需要,我宁愿不创建多个 List 对象。
如果用户的信息在 SentTo
中,我的信息将在 SentFrom
中,反之亦然,所以我确实有一些方法可以检查用户的数据在哪里。
我有没有提到我是 LINQ 的新手?任何帮助将不胜感激。
应该很简单,看这段代码:
string username = "John";
var q = ecml.Where(i=>i.SentFrom == username || i.SentTo == username).OrderByDescending(m => m.SendDate).First();
它只是过滤您的 collection,选择 SentFrom 或 SentTo 等于 username
的项目。
由于您需要将每条记录解释两次 - 即作为 SentTo
和 SentFrom
,查询变得有点棘手:
var res = ecml
.SelectMany(m => new[] {
new { User = m.SentFrom, m.SendDate }
, new { User = m.SentTo, m.SendDate }
})
.GroupBy(p => p.User)
.Select(g => new {
User = g.Key
, Last = g.OrderByDescending(m => m.SendDate).First()
});
关键技巧在 SelectMany
,它使每个 ChatMessage
项目成为两个匿名项目 - 一个将 SentFrom
用户与 SendDate
配对,另一个将 SentTo
用户与同一日期配对。
一旦您在可枚举中拥有两条记录,剩下的就很简单了:按用户分组,然后将 post 中的查询应用于每个组。