Ответ 1
Я уверен, что у тебя все получилось. И SQL, который LINQ генерирует и отправит на ваш db, будет выглядеть так же, как SQL, с которого вы начали, поэтому, пока вы немного набираете текст, ваша база данных больше не работает.
Предполагая таблицу тегов, такую как теги вопросов 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, и это кажется неправильным. Пожалуйста, покажите мне, как это было сделано.
Я уверен, что у тебя все получилось. И SQL, который LINQ генерирует и отправит на ваш db, будет выглядеть так же, как SQL, с которого вы начали, поэтому, пока вы немного набираете текст, ваша база данных больше не работает.
Если вы хотите объекты 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);
Если вы используете подробную форму синтаксиса, ваш код будет подробным. Вот альтернатива:
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();
Я думаю, вы также несправедливы в том, что ваш SQL-запрос не делает то же самое, что и ваш запрос LINQ - он не возвращает 25 лучших.