Porta (limiti) una lista all’interno di Groupby in Entity Framework

Devo prendere (per esempio 2), 2 messaggi da una conversazione

Non mi interessa come appare la mia lista, ma voglio solo 2 messaggi da id 1, 2 messaggi da id2 e proseguo

esempio:

id = idConversation

Id | MessageId | Message ---|-----------|-------- 1 | 1 | "asd" 1 | 2 | "asd2" 1 | 3 | "asd3" 1 | 4 | "asd4" 2 | 5 | "asd5" 3 | 6 | "asd6" 3 | 7 | "asd7" 3 | 8 | "asd8" 3 | 9 | "asd9" 3 | 10 | "asd10" 4 | 11 | "asd11" 4 | 12 | "asd12" 4 | 13 | "asd13" 

e lo voglio

 Id MessageId Message ---|-----------|-------- 1 | 1 | "asd" 1 | 2 | "asd2" 2 | 5 | "asd5" 3 | 6 | "asd6" 3 | 7 | "asd7" 4 | 11 | "asd11" 4 | 12 | "asd12" 

Posso grouby idConversation, ma non posso limitare la quantità usando grouby in una conversazione.

 var test = unitOfWork.ChatMensagemRepository.GetAll() .Where(x => x.PessoaCodigoPessoa == codigoRemetente) .GroupBy(x => x.ChatConversaCodigoChatConversa) .Select(group => new { codigoChat = group.Key, list = group.Select(mensagem => new { // do stuff }) }).ToList(); 

questo è ok … ma non limitare la mia lista, quando faccio group.take (2). Seleziona ….. dammi “Subquery restituisce più di 1 riga”

 var test = unitOfWork.ChatMensagemRepository.GetAll() .Where(x => x.PessoaCodigoPessoa == codigoRemetente) .GroupBy(x => x.ChatConversaCodigoChatConversa) .Select(group => new { codigoChat = group.Key, list = group.Take(2).Select(mensagem => new { // do stuff }) }).ToList(); 

errore: la sottoquery restituisce più di 1 riga

 var test = unitOfWork.ChatMensagemRepository.GetAll() .Where(x => x.PessoaCodigoPessoa == codigoRemetente) .GroupBy(x => x.ChatConversaCodigoChatConversa) .Select(group => new { codigoChat = group.Key, list = group.Select(mensagem => new { // do stuff }).take(2) }).ToList(); 

errore: la sottoquery restituisce più di 1 riga

È causato dal fatto che il provider EF per MySQL o il server stesso non è in grado di tradurre questo linq in SQL, quindi è necessario prima ottenere i dati dal server e solo successivamente raggrupparli con Take(2) :

 var test = unitOfWork.ChatMensagemRepository.GetAll() .Where(x => x.PessoaCodigoPessoa == codigoRemetente) //this section is added .Select(x => new { x.ChatConversaCodigoChatConversa, x.prop1,//specify only columns, which you need for below code with Take x.prop2 }).ToList() //end of section .GroupBy(x => x.ChatConversaCodigoChatConversa) .Select(group => new { codigoChat = group.Key, list = group.Take(2).Select(mensagem => new { mensagem.prop1, mensagem.prop2 }).ToList() }).ToList();