首先要做的事情 - 我在visual studio 2012中使用C#连接到SqlServerCe数据库。 我正在使用Entity framework 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*
我尝试了几种方法,主要是通过使用Union,我首先得到所有那些属于第0组的记录,然后先在其他记录上做一组,然后将它们组合在一起以得到最终结果。
然而,这似乎非常低效并需要一个年龄来执行 - 更不用说Linq声明很难遵循。
有人能指出我可以遵循的方向来执行此功能吗?
答案 0 :(得分:1)
您希望使用SelectMany()
,根据组ID有条件地返回所有或仅一个分组序列:
var result = (from item in data
group item by item.Group)
.SelectMany(group => group.Key == 0 ? group : group.Take(1));
答案 1 :(得分:0)
此代码将为您提供非零组的结果。同样,你可以找出另一组。我希望这会有所帮助。
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