[英]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很新嗎? 任何幫助將不勝感激。
由於您需要兩次解釋每條記錄 - 即作為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
用戶與同一日期配對。
一旦您將兩個記錄都包含在可枚舉中,其余記錄就很簡單:您按用戶分組,然后將查詢從您的帖子應用到每個組。
它應該很簡單,看看這段代碼:
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.