Как получить группу, упорядоченную по столбцу подсчета - PullRequest
4 голосов
/ 01 ноября 2010

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

Вот мой код SQL:

select top 100 [Name], COUNT([Name]) as total from ActivityLog  
where [Timestamp] between '2010-10-28' and '2010-10-29 17:00'  
group by [Name]  
order by total desc  

Мне нужно написатьчто в LinQ.Пока у меня есть следующее:

var groups = from ActivityLog log in ctx.ActivityLog
 where log.Timestamp > dateFrom
 where log.Timestamp <= dateTo
 group log by log.Name;

, но у меня нет столбца COUNT(*) для сортировки: (

Ответы [ 2 ]

7 голосов
/ 01 ноября 2010

Боюсь, мне гораздо удобнее использовать свободный синтаксис (в отличие от синтаксиса запросов), но вот один из возможных ответов LINQ:

 ctx.ActivityLog
   .Where(x => x.TimeStamp > dateFrom && x.TimeStamp <= dateTo)
  .GroupBy(x => x.Name)
  .Select(x => new { Name = x.Key, Total = x.Count() })
  .OrderByDescending(x => x.Total)
  .Take(100)

EDIT:

Хорошо, я вышел из своей зоны комфорта и предложил версию синтаксиса запроса, просто не ожидайте слишком многого. Я предупреждал вас о моих способностях выше:

(from y in (
    from x in (
        from log in ActivityLog
        where log.Timestamp > dateFrom
        where log.Timestamp <= dateTo
        group log by log.Name)
    select new { Name = x.Key, Total = x.Count() })
orderby y.Total descending
select new { Name = y.Name, Total = y.Total }).Take(100)
3 голосов
/ 01 ноября 2010

Ответ diceguyd30 технически является LINQ и является правильным.Фактически, синтаксис запроса переводится компилятором в эти методы Queryable / Enumerable.Тем не менее, нам не хватает синтаксиса group ... by ... into .Эквивалентный запрос должен быть близок к этому:

var query = from log in ctx.ActivityLog
            where log.TimeStamp > dateFrom && log.TimeStamp <= dateTo
            group log by log.Name into grouping
            orderby grouping.Count() descending
            select new { Name = grouping.Key, Total = grouping.Count() };

var result = query.Take(100);

Обратите внимание, что в C # метод Take(100) не имеет эквивалента в синтаксисе запроса, поэтому необходимо использовать метод расширения.VB.NET, с другой стороны, поддерживает Take и Skip в синтаксисе запроса.

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