根据LINQ / lambda中Group By语句的计数创建计数

时间:2012-11-02 02:32:10

标签: c# linq lambda

我想要做的是通过Employer将大量记录组合在一起。然后,我想返回一个整数变量,该变量只包含至少30个记录的组。

即。我在100Employer A个订阅者,20Employer B30Employer C

我将记录分组并提出

Employer A - 100
Employer B - 20
Employer C - 30

我想返回2的标量变量。

以下是我目前的情况:

var Step1 =
    (from y in recordsActivstJoin
     where y.q.Market.Contains(market) && y.x.ActivistCodeID.Equals(activismCode)
     select new {y}).ToList();

            //this groups my previous query
var Step2 = (from z in Step1 group z by z.y.q.Employer into f select new {f}).ToList();

当我观察当地人时,我可以看到它确实从步骤1开始分组,其中步骤2中有34行到17行。现在,我想要缩小到只有那些组> = 30的那些。 / p>

有什么建议吗?

2 个答案:

答案 0 :(得分:5)

我不是盲目写LINQ的最佳人选,但我相当确定你正在寻找一些非常接近以下内容的东西:

var Step1 =
                (from y in recordsActivstJoin
                 where y.q.Market.Contains(market) && y.x.ActivistCodeID.Equals(activismCode)
                 select new {y}).ToList();

                        //this groups my previous query
var Step2 = (from i in Step1 group i by i.y.q.Employer into groupedEmployees
select new 
{
    EmployeeCount = groupedEmployees.Count()
}).Where(n=>n.EmployeeCount >= 30).Count();
帕特里克指出,这可以缩短为:

var Step2 = Step1.GroupBy(i => i.y.q.Employer).Count(g => g.Count() >= 30);
在您的示例中,

Step2应为2。希望这有帮助!

答案 1 :(得分:1)

作为替代方案:

  • 查询雇主对记录进行分组:

代码:

var groupedRecords = recordsActivstJoin
                     .Where(y => y.q.Market.Contains(market) && y.x.ActivistCodeID.Equals(activismCode))
                     .ToLookup(y => y.q.Employer);
  • 包含30个以上条目的群组的计数:

代码:

Int32 count = groupedRecords.Count(g => g.Count() >= 30);

注意:

与GroupBy相比,ToLookup最常用于雪崩安全,而GroupBy通常不是。这取决于用于查询您的数据的提供商,例如LinqToObject没有区别,而对于LinqToSql,各种数据集存在巨大差异。

ToLookup是立即执行的,所以如果你想为分组执行deffer,你需要走另一条路。