2017-08-21 20 views
-2
にすることを取ると、グループ

私が取る必要がある(例えば、2)、会話から2つのメッセージEntityFramework

例:

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" 

と私はしたい

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

私はgugey idConversationすることができますが、私は会話でgroubyを使用して数量を制限できません。

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

これはokです...しかし、私はgroup.takeを行うとき(2).Selectが..... は私を与える、私のリストを制限いけない

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(); 
"サブクエリは複数の行を返します"

エラー:サブクエリがここ以上の1行

+1

たぶん、あなたは* * – Strawberry

+0

あなたはどのように決めるかを何ができるか私たちを見ます「Id == 1」というグループの人は他人と遊ぶことを許されていない悪い子供ですか? –

+0

私は1分を表示します –

答えて

0

を戻します:サブクエリが1以上行

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

エラーを返し私があなたが思っていることの一例です。このクエリは、各クラスにGPAでトップ3 sudtentsを返します。

using System; 
using System.Collections.Generic; 
using System.Data.Entity; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace Ef6Test 
{ 

    class Student 
    { 
     public int Id { get; set; } 
     public string Name { get; set; } 

     public string Class{ get; set; } 

     public decimal GPA { get; set; } 
    } 

    class Db : DbContext 
    { 
     public DbSet<Student> Students { get; set; } 
    } 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      using (var db = new Db()) 
      { 
       var q = db.Students 
         .GroupBy(s => s.Class) 
         .SelectMany(g => g.OrderByDescending(s => s.GPA).Take(3)); 

       Console.WriteLine(q.ToString()); 

       Console.ReadKey(); 
      } 

     } 
    } 
} 
+0

+ \t \tのInnerException \tと私の質問を更新\tのSystem.Exception {MySql.Data.MySqlClient.MySqlException}私は知らない –

+0

{ "サブクエリは複数の行を返します"}。そのクエリパターンはSQL Serverで機能します。あなたが適切なアイテムのコレクションにダウンリストを平坦化することができるSelectMany' ' –

0

私はこのコードを試してみましたが、正常に動作している:

class Conversation 
{ 
    public int Id; 
    public string Message; 
    public int MessageId; 
} 

class Program 
{ 

    static void Main(string[] args) 
    { 
     var inputList = new List<Conversation> 
     { 
      new Conversation() {Id = 1, Message = "asd0", MessageId = 1}, 
      new Conversation() {Id = 1, Message = "asd1", MessageId = 2}, 
      new Conversation() {Id = 1, Message = "asd2", MessageId = 3}, 
      new Conversation() {Id = 2, Message = "asd3", MessageId = 4}, 
      new Conversation() {Id = 2, Message = "asd4", MessageId = 5}, 
      new Conversation() {Id = 2, Message = "asd5", MessageId = 6}, 
      new Conversation() {Id = 3, Message = "asd6", MessageId = 7} 
     }; 

     var outputList = inputList.GroupBy(x => x.Id) 
      .SelectMany(x => x.OrderBy(y => y.MessageId).Take(2).ToList()) 
      .ToList(); 

     Console.ReadKey(); 
    } 
} 
+0

\tのSystem.Exception {MySql.Data.MySqlClient.MySqlException} –

+0

+ \t \tのInnerExceptionを使用する場合、\t {「サブクエリが1つの以上の行を返す」} –

+0

@AntonioHenrique私は答えを – Mhd