Подтвердить что ты не робот

"Самый популярный" GROUP BY в LINQ?

Предполагая таблицу тегов, такую ​​как теги вопросов stackoverflow:

TagID (bigint), QuestionID (bigint), тег (varchar)

Каков наиболее эффективный способ получить 25 наиболее используемых тегов с помощью LINQ? В SQL простая команда GROUP BY выполнит:

SELECT Tag, COUNT(Tag) FROM Tags GROUP BY Tag

Я написал несколько LINQ, которые работают:

var groups = from t in DataContext.Tags
             group t by t.Tag into g
             select new { Tag = g.Key, Frequency = g.Count() };
return groups.OrderByDescending(g => g.Frequency).Take(25);

Как, действительно? Разве это не мега-многословие? Печально то, что я делаю это, чтобы сохранить огромное количество запросов, так как мои объекты Tag уже содержат свойство Frequency, которое в противном случае нужно было бы проверить с базой данных для каждого тега, если я действительно использовал свойство.

Итак, я затем разбираю эти анонимные типы обратно в объекты Tag:

groups.OrderByDescending(g => g.Frequency).Take(25).ToList().ForEach(t => tags.Add(new Tag()
{
    Tag = t.Tag,
    Frequency = t.Frequency
}));

Я новичок в LINQ, и это кажется неправильным. Пожалуйста, покажите мне, как это было сделано.

4b9b3361

Ответ 1

Я уверен, что у тебя все получилось. И SQL, который LINQ генерирует и отправит на ваш db, будет выглядеть так же, как SQL, с которого вы начали, поэтому, пока вы немного набираете текст, ваша база данных больше не работает.

Ответ 2

Если вы хотите объекты Tag, почему бы не создать их непосредственно из вашего запроса Linq?

var groups = from t in DataContext.Tags
             group t by t.Tag into g
             select new Tag() { Tag = g.Key, Frequency = g.Count() };

return groups.OrderByDescending(g => g.Frequency).Take(25);

Ответ 3

Если вы используете подробную форму синтаксиса, ваш код будет подробным. Вот альтернатива:

List<Tag> result = 
  db.Tags
  .GroupBy(t => t.Tag)
  .Select(g => new {Tag = g.Key, Frequency = g.Count()})
  .OrderByDescending(t => t.Frequency)
  .Take(25)
  .ToList()
  .Select(t => new Tag(){Tag = t.Tag, Frequency = t.Frequency})
  .ToList();

Ответ 4

Я думаю, вы также несправедливы в том, что ваш SQL-запрос не делает то же самое, что и ваш запрос LINQ - он не возвращает 25 лучших.