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

C# 分组,返回一个组中的所有内容,但仅返回其他组中的第一个,c#,linq,visual-studio-2012,entity-framework-6,sql-server-ce-4,C#,Linq,Visual Studio 2012,Entity Framework 6,Sql Server Ce 4,第一件事-我正在visual studio 2012中使用C#连接到SqlServerCe数据库。 我使用实体框架6和Linq来执行此功能。 关于这个问题 我有一张桌子如下 ItemGroup ( ID INT PRIMARY KEY, ItemID INT, GroupID INT ) 有两个表通过其ID和项目组表中的两个外键列链接到此(项目和组) 每个项目可以是一个组的一部分,每个组可以有多个项目 如果项目的组ID为0,则认为该项目不属于组 结果是大约有3000个组,每个组有2

第一件事-我正在visual studio 2012中使用C#连接到SqlServerCe数据库。 我使用实体框架6和Linq来执行此功能。 关于这个问题

我有一张桌子如下

ItemGroup
(
  ID INT PRIMARY KEY,
  ItemID INT,
  GroupID INT
)
有两个表通过其ID和项目组表中的两个外键列链接到此(项目和组)

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

如果项目的组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声明很难遵循


是否有人可以为我指出一个执行此功能可能需要遵循的方向?

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

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

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

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

您可以发布相关表的模式吗?