如何在 Entity Framework linq 中使用多个 groupby 语句?

Posted

技术标签:

【中文标题】如何在 Entity Framework linq 中使用多个 groupby 语句?【英文标题】:How to use multiple groupby statements in Entity Framework linq? 【发布时间】:2020-11-26 06:31:54 【问题描述】:

我有一个包含这些列的表格:

POS
CropName
productionQty

我必须找到包含更多作物的POS

我试过了

  from r in await _crops.GetAll()
  group r by r.CropName
  into g
  select new
         
             id = g.Key,
             sum = g.Sum(r => r.productionQty),
             name = g.First().PosName,
             cropname = g.First().CropName,
         ;

我已经获得了所有的作物数量,但我需要根据包含更高数量的 POS 进行作物。

   Example:
   PosName productionQty CropName
    POS1     100         Crop1
    POS2      200        crop2
    Pos1     300         crop1
    pos1     200          crop2

我想要以下结果:

    PosName productionQty CropName
    POS1     400         Crop1
    POS2     200        crop2
    pos1     200          crop2
    

【问题讨论】:

higher quantity 这是什么意思?你的意思是你想排序? 你能提供示例数据吗? 看看问题。我已经编辑了问题 示例结果只显示了由PosName, CropName 对与求和productionQty 分组的示例数据,这是您要找的吗?如果是,只需查看按复合键分组的 LINQ 文档/示例。 我们不理解您的要求,因为“更高”是一个比较的词,例如您可以说“这台电视的价格比那台电视高”。你不能说“这五台电视机的价格分别是 100、200、300、400、500,哪个更高?”因为 200 比 100 高,300 比 200 和 100 高。有太多的数字比另一个数字“高”。 “最高”的价格是 500,只有一个价格最高,但“更高”需要一些东西来比较才有意义,比如“有多少电视的价格‘高于’250?” 【参考方案1】:

刚刚离开你的“期望结果”,看起来你可能想换行:

group r by r.CropName

group r by r.CropName.ToLower() +'\n' + r.PosName.ToLower()

这意味着大小写将被忽略,并且有两行具有 pos1/crop1 的结果将被合并,但 pos1/crop2 和 pos2/crop2 的其他行将是分开的

您应该记住,它可能不会产生您想要的结果,因为您获得的 PosName 和 CropName 将取决于结果组列表中最先出现的元素。这些东西是不区分大小写的,所以 pos1, POS1, PoS1 分组列表和 first()'d 将返回 pos1,但列表 POS1, pos1, PoS1 将返回 POS1

【讨论】:

以上是关于如何在 Entity Framework linq 中使用多个 groupby 语句?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Sql 查询转换为 Linq 及其在 Entity Framework Core 中的 Join() 方法的等价物

linq to sql、Entity Framework 和 NHibernate 的性能如何?

在 Entity Framework Core 中,如何使用数据库级别的条件(不是本地 LINQ)查询连接表上的数据?

请问在 .NET Core 中如何让 Entity Framework Core 在日志中记录由 LINQ 生成的SQL语句?

使用 Entity Framework Core 在 LINQ 查询中将字符串转换为 DateTime

在 .NET Core 中如何让 Entity Framework Core 在日志中记录由 LINQ 生成的SQL语句