我想要做的是通过Employer
将大量记录组合在一起。然后,我想返回一个整数变量,该变量只包含至少30
个记录的组。
即。我在100
有Employer A
个订阅者,20
有Employer B
,30
有Employer 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>
有什么建议吗?
答案 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);
代码:
Int32 count = groupedRecords.Count(g => g.Count() >= 30);
注意:
与GroupBy相比,ToLookup最常用于雪崩安全,而GroupBy通常不是。这取决于用于查询您的数据的提供商,例如LinqToObject没有区别,而对于LinqToSql,各种数据集存在巨大差异。
ToLookup是立即执行的,所以如果你想为分组执行deffer,你需要走另一条路。