2015-04-16 10 views
5

sto cercando di ottenere l'ultimo contatto con un determinato utente, raggruppati per utente:Come faccio a raggruppare su uno dei due possibili campi usando LINQ?

public class ChatMessage 
{ 
    public string SentTo { get; set; } 
    public string SentFrom { get; set; } 
    public string MessageBody { get; set; } 
    public string SendDate { get; set; } 
} 

informazioni di contatto dell'utente potrebbe essere sia in SentTo o SentFrom.

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

mi darebbe l'ultimo messaggio, ma ho bisogno dell'ultimo messaggio per utente. La soluzione più vicina che ho trovato era LINQ Max Date with group by, ma non riesco a capire la sintassi corretta. Preferirei non creare più oggetti List se non dovessi farlo. Se le informazioni dell'utente sono in SentTo, le mie informazioni saranno in SentFrom e viceversa, quindi ho un modo per controllare dove sono i dati dell'utente.

Ho detto che ero molto nuovo a LINQ? Qualsiasi aiuto sarebbe molto apprezzato.

+3

'GroupBy' utente, quindi' .Seleziona (g => g.OrderByDescending (m => m.SendDate) .First(); ' –

+0

È sempre possibile effettuare 2 query separate, prima con l'utente in SentTo, secondo con utente in SentFrom e poi prendere il massimo da uno di questi due. –

+0

Grazie per la risposta, ma come si raggruppa per SentTo OR SentFrom nella stessa istruzione? È possibile, oppure è necessario copiare l'elenco e modificarlo in combinare i campi, quindi raggruppare il nuovo elenco? – Darkloki

risposta

2

Dal momento che è necessario interpretare ogni record due volte - vale a dire come un SentTo e SentFrom, la query diventa un po 'complicato:

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() 
    }); 

Il trucco chiave è in SelectMany, che rende ogni ChatMessage voce in due anonimi elementi: uno che accoppia l'utente SentFrom con SendDate e uno che accoppia l'utente SentTo con la stessa data.

Una volta che entrambi i record sono enumerabili, il resto è semplice: si raggruppa per l'utente e quindi si applica la query dal proprio post a ciascun gruppo.

0

Dovrebbe essere abbastanza facile, guarda questo codice:

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

Semplicemente filtrare la vostra collezione di essere la scelta di oggetti che sia SentFrom o SentTo è pari a username.

+2

Questo non risponde alla domanda dell'OP – BrokenGlass

Problemi correlati