2

我想要做的是将一大堆记录按Employer. 然后,我想返回一个整数变量,它只计算那些至少有30记录的组。

IE 我在、at和at有100订阅者。Employer A20Employer 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 步中的 34 行向下分组到第 2 步中的 17 行。现在,我只想缩小到组 >=30 的那些。

有什么建议么?

4

2 回答 2

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在你的例子中。希望这可以帮助!

于 2012-11-02T02:40:21.087 回答
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 很可能是雪崩安全的。这取决于用于查询您的数据的提供程序,例如 LinqToObject 没有区别,而 LinqToSql 则在大量不同的数据集上存在巨大差异。

ToLookup 是立即执行,所以如果你想推迟分组的执行,你需要走一条不同的路。

于 2012-11-02T10:10:00.580 回答