如何根据某些标准按多个记录自定义组

时间:2012-11-07 12:12:36

标签: c# linq entity-framework c#-4.0 linq-to-sql

请考虑这种情况:

我有这样的数据:

 Id          Group            Value
 -----------------------------------
 1            1                100
 2            1                120
 3            1                100
 4            2                90
 5            2                105
 6            3                300
 7            4                123
 8            4                110
 9            5                100
 10           5                110

我希望GroupBy对此数据1,2,3位于一个组中,4,5位于另一个组中。我如何使用LINQ

执行此操作

感谢


修改1)

我想将1,2,3放在一个组中,4,5放在另一个组中,然后对它们执行Count聚合,第一组 6 ,<第二组强> 4

3 个答案:

答案 0 :(得分:2)

这个怎么样?

        int[] groupA = { 1, 2, 3 };
        int[] groupB = { 4, 5 };

        var result = data
            .GroupBy(a => groupA.Contains(a.Group) ? "A" : 
                          groupB.Contains(a.Group) ? "B" : 
                          "N/a")
            .Select(a => new
            {
                KEY = a.Key,
                VALUE = a.Count()
            });

答案 1 :(得分:0)

因此,分组规则完全不清楚,您只需要计算项目数,我认为您根本不需要分组

int[] groups = { 1, 2, 3 }; // or { 4, 5 } for other groups
var groupsCount = items.Where(i => groups.Contains(i.Group))
                       .Count();

您可以将此查询放入方法(假设项目是字段)

int GetItemsCountInGroups(params int[] groups)
{
    return items.Where(i => groups.Contains(i.Group))
                .Count();
}

用法

int count = GetItemsCountInGroups(1, 2, 3); // 6
int anotherCount =  GetItemsCountInGroups(4, 5); // 4

答案 2 :(得分:0)

在这种情况下,您需要一个将1,2,3映射到1的功能,然后让我们说4,52,然后func<int,int> grouper = i => (i -1) / 3应该适合您的目的对于这个数据集。

然后是linq:

var result = data.GroupBy( r => (r.Group-1)/3,
                           g => g.Count());

注意:如果要在数据库端完成此操作,则需要小心,因为除法运算符可能无法按您的意图进行映射。即在c#int division中返回一个int,因此给出了分数的整数部分,而数据库可能返回一个Double,从而打破了所需的分组。在这种情况下,您需要r => ((r.Group -1) - (r.Group -1) %3 )/3之类的东西。