Linq извлекает значение count () из объекта данных - PullRequest
0 голосов
/ 21 декабря 2010

У меня есть divAssignments, которые могут иметь несколько строк по rNI, официальному идентификатору, в соответствии с составным ключом обвинительного заключения и номеров бронирования.

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

Так ID имеет счет 3 для одного номера бронирования для этого RNI.

Я заблудился, пытаясь сгенерировать счет и группу, заказав номер:

var moreThen = from dA in divAssignments
    select new { dA.rNI, IndictmentCount = dA.indictmentNumber.Count() };

Большинство примеров имеют дело со static int [] и, похоже, не работают в моем случае.

Как получить группу, а затем подсчитать? Если бы я мог иметь в себе это было бы здорово.

из t-sql POV Я бы использовал это:

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

ТИА

Ответы [ 4 ]

1 голос
/ 21 декабря 2010

Примерно так:

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
    };

ИЛИ

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

и реализовать IEquatable на объекте divAssignment для поддержки сравнения на равенство.Другой вариант, если вы хотите, - написать экземпляр IEqualityComparer , чтобы выполнить сравнение составного ключа.Ваш запрос может выглядеть так:

var query = 
  divAssignments
      .GroupBy(i => i, new MyCustomEqualityComparer())
      .Select(i => new { Key = i.Key, Count = i.Count());
0 голосов
/ 21 декабря 2010

Использование синтаксиса метода (на мой взгляд, гораздо проще читать):

Сначала сгруппируйте записи, затем выберите новый результат для каждой группы, содержащей количество.

var groups = divAssignments.GroupBy(d => new { d.rNI, d.Booking });
groups.Select(g=> new { g.Key.rNI, g.Key.Booking, IndictmentCount = g.Count() });
0 голосов
/ 21 декабря 2010

Если вы используете оператор группировки в Linq, вы получите то, что вам нужно.Код:

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

вернет коллекцию IGrouping объектов.Это даст вам ключ (в моем примере это будет анонимный тип с rNI и свойством Booking) и коллекцию divAssignments, которые соответствуют ключу.

0 голосов
/ 21 декабря 2010
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());
}
...