簡體   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