【问题标题】:Take and Group By in EntityFramework [duplicate]EntityFramework中的Take和Group By [重复]
【发布时间】:2018-01-29 15:46:37
【问题描述】:

我需要从一个对话中获取(例如 2 条)2 条消息

示例:

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"

我可以 grouby 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();

这没关系...但不要限制我的列表,当我执行 group.take(2).Select 时...... 给我“子查询返回超过 1 行”

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 行

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

错误:子查询返回多于 1 行

【问题讨论】:

  • 也许向我们展示你可以做什么
  • 你如何判断Id==1组里谁是不允许和其他人一起玩的坏孩子?=!
  • 我会显示,一分钟
  • 已编辑:当我将 .take(number) 放在 mensagens 上时,我收到消息“空引用”。字符串
  • 您可以使用子查询从您的组中获取最多 N 行来解决问题。搜索基于 sql 的解决方案可能会有所帮助。

标签: c# mysql entity-framework linq


【解决方案1】:

我试过这段代码并且工作正常:

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

【讨论】:

  • 如果您使用SelectMany,您可以将列表展平为适当项目的集合
  • + InnerException {"子查询返回超过 1 行"} System.Exception {MySql.Data.MySqlClient.MySqlException}
  • @AntonioHenrique 我更新了答案
  • @Mhd 不工作,我用更多示例更新了我的问题
【解决方案2】:

这是我认为您所追求的示例。此查询将返回每个班级 GPA 排名前 3 的学生:

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

        }
    }
}

【讨论】:

  • + InnerException {"子查询返回超过 1 行"} System.Exception {MySql.Data.MySqlClient.MySqlException}
  • 我不知道。该查询模式适用于 SQL Server。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-16
  • 2021-09-23
  • 2013-09-20
  • 2018-05-18
  • 2018-06-29
相关资源
最近更新 更多