【问题标题】:Group by with return everything from one group but only the first from others分组,返回一个组的所有内容,但只返回其他组的第一个
【发布时间】:2014-11-06 13:58:15
【问题描述】:

首先要做的是 - 我在 Visual Studio 2012 中使用 C# 连接到 SqlServerCe 数据库。 我正在使用实体框架 6 和 Linq 来执行此功能。 所以 - 关于这个问题。

我有一张如下表

ItemGroup
(
  ID INT PRIMARY KEY,
  ItemID INT,
  GroupID INT
)

有两个表通过它们的 ID 和 Item Group 表中的两个外键列链接到这个(Items 和 Groups)。

每个项目可以是一个组的一部分,每个组可以有多个项目。

如果项目的组 ID 为 0,则认为它不是组的一部分

这样的结果是大约有 3000 个组,每个组有 2 -> ~30 个项目,但有一个组有大约 4000 个项目。

我的问题是我有一个项目列表,我想从每个组中只返回一个,除非该项目是第 0 组的一部分(即没有组)。在第 0 组的情况下,我想返回所有匹配的项目。

例如:

**Group 0**

*Item 1,
Item 2,
Item 3,*

**Group 1**

*Item 4,
Item 5*

**Group 2**

*Item 6,
Item 7,
Item 8*

**Group 3**

*Item 9*

我有以下项目的清单:

*Item1, Item2, Item4, Item5, Item6, Item7*

在这种情况下,我想输出列表中第 0 组中的所有项目:

*Item1, Item2*

第 4 项是第 1 组的一部分,所以我们想显示它,但由于第 5 项是同一组的一部分,我们不希望这样,所以我的列表的其余部分将显示如下:

*Item4, Item6*

提供完整列表:

*Item1, Item2, Item4, Item6*

我尝试了几种方法,主要是通过使用联合,我首先获取属于第 0 组的所有记录,然后首先对其他记录进行分组,然后将它们联合在一起以获得最终结果。

然而,这似乎效率极低,并且需要很长时间才能执行 - 更不用说 Linq 语句很难遵循。

有人可以指出我可以遵循的方向以执行此功能吗?

【问题讨论】:

  • 您可以发布相关表的架构吗?

标签: c# linq visual-studio-2012 entity-framework-6 sql-server-ce-4


【解决方案1】:

您想使用SelectMany(),根据组 ID 有条件地返回所有或仅一个分组序列:

var result = (from item in data
             group item by item.Group)
             .SelectMany(group => group.Key == 0 ? group : group.Take(1));

【讨论】:

    【解决方案2】:

    此代码将为您提供非零组的结果。同样,您可以找出另一组。我希望这会有所帮助。

    var query1 = from t in context.Table1
                         where t.GroupID != 0
                         group t by t.GroupID into g
                         select new
                         {
                             ID = g.Key,
                             Groups = g.Take(1)
                         };
    
    
            Console.WriteLine("items with non 0 group");
            foreach (var item in query1)
            {
    
                foreach (var g in item.Groups)
                {
                    Console.WriteLine(" ID " + g.ID + " " + "Group ID " + g.GroupID  + " " + " Item ID " + g.ItemID);    
                }
    
    
    
            }
    

    输入数据

    ID  ItemID  GroupID
    
     1    1      0
     2    2      0
     3    3      0
     4    4      1
     5    5      1
     6    6      2
     7    7      2
     8    8      2
    

    生成的输出

    items with non 0 group
    
    ID 4 Group ID 1  Item ID 4
    ID 6 Group ID 2  Item ID 6
    

    【讨论】:

      猜你喜欢
      • 2021-08-22
      • 2011-11-05
      • 2012-01-01
      • 2019-07-21
      • 2011-07-12
      • 2012-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多