Linq从数据对象中提取count()值

时间:2010-12-20 22:54:13

标签: linq grouping having

根据起诉书和预订号码的复合键,我有divAssignments有rNI潜在的多行,一个官方ID。

rNI    Booking  Indictment
12345  954445   10 12345
12345  954445   10 12346
12345  954445   10 12347

因此,对于此rni的单个预订号,ID的计数为3。

我想通过预订号码

来尝试生成一个计数和一组人
var moreThen = from dA in divAssignments
    select new { dA.rNI, IndictmentCount = dA.indictmentNumber.Count() };

大多数示例都处理静态int [],在我的情况下似乎不起作用。

如何获得一个小组然后计算?如果我可以投入一个太棒了。

来自t-sql POV我会用这个:

Select rni, bookingNumber, count(*) IndictmentCount 
from divAssignments
group by rni, bookingNumber  
having count(*) > 0 

TIA

4 个答案:

答案 0 :(得分:1)

这样的事情怎么样:

var query = from item in divAssignments
group item by item.rNI into grouping
select new
{
  Id = grouping.Key,
  Count = grouping.Count()
}

如果您对通过rNI和预订编号进行分组感兴趣,我会将其更改为:

var query = from item in divAssignements
   group item by new { item.rNI, a.Booking } into grouping
   select new
    {
      Id = grouping.Key,
      Count = grouping.Count
    };

OR

var query = from item in divAssignments
    group item by item into grouping
    select new
    {
      Id = grouping.Key,
      Count = grouping.Count()
    }

并在divAssignment对象上实现IEquatable以支持相等性比较。如果您愿意,另一个选项是编写IEqualityComparer实例来进行复合键比较。您的查询可能如下所示:

var query = 
  divAssignments
      .GroupBy(i => i, new MyCustomEqualityComparer())
      .Select(i => new { Key = i.Key, Count = i.Count());

答案 1 :(得分:0)

var query =
    from dA in divAssignments
    group dA by new { dA.rNI, dA.bookingNumber };

foreach(var grp in query)
{
    Console.WriteLine("rNI={0}, bookingNumber={1} => Count={2}", grp.Key.rNI, grp.Key.bookingNumber, grp.Count());
}

答案 2 :(得分:0)

如果您在Linq中使用Grouping operator,您将获得所需。代码:

  var count = from a in divAssignments
              group a by new { a.rNI, a.Booking } into b
              select b;

将返回IGrouping个对象的集合。这将为您提供密钥(在我的示例中,这将是一个带有rNI和Booking属性的匿名类型)以及与密钥匹配的divAssignments集合。

答案 3 :(得分:0)

使用Method语法(在我看来更容易阅读):

首先对记录进行分组,然后为包含计数的每个组选择一个新结果。

var groups = divAssignments.GroupBy(d => new { d.rNI, d.Booking });
groups.Select(g=> new { g.Key.rNI, g.Key.Booking, IndictmentCount = g.Count() });