逐组返回一组中的所有内容,但仅返回其他组中的第一个

本文关键字:返回 第一个 其他 一组 | 更新日期: 2023-09-27 18:29:19

首先,我正在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中的所有记录,然后对其他记录进行分组,然后将它们并集在一起以获得最终结果。

然而,这似乎效率极低,而且需要很长时间才能完成——更不用说林克的说法很难遵循。

有人能为我指明一个方向吗?为了履行这一职能,我可能会遵循这个方向?

逐组返回一组中的所有内容,但仅返回其他组中的第一个

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

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

此代码将为非零组提供结果。同样,你也可以算出另一组。我希望这能有所帮助。

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