繁体   English   中英

如何使用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; }
}

用户的联系信息可以是SentToSentFrom

List<ChatMessage> ecml = new List<ChatMessage>();
var q = ecml.OrderByDescending(m => m.SendDate).First();

会给我最新的消息,但我需要每个用户的最后一条消息。 我能找到的最接近的解决方案是LINQ Max Date with group by ,但我似乎无法找出正确的语法。 如果我不需要,我宁愿不创建多个List对象。 如果用户的信息在SentTo ,我的信息将在SentFrom ,反之亦然,所以我确实有办法检查用户数据的位置。

我提到过我对LINQ很新吗? 任何帮助将不胜感激。

由于您需要两次解释每条记录 - 即作为SentToSentFrom ,查询变得有点棘手:

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用户与同一日期配对。

一旦您将两个记录都包含在可枚举中,其余记录就很简单:您按用户分组,然后将查询从您的帖子应用到每个组。

它应该很简单,看看这段代码:

string username = "John";
var q = ecml.Where(i=>i.SentFrom == username || i.SentTo == username).OrderByDescending(m => m.SendDate).First();

它只是过滤您的集合,选择SentFrom或SentTo等于username

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM