Использование Linq для получения резюме и подсчета - PullRequest
0 голосов
/ 02 марта 2011

У меня есть база данных SQL Server с таблицей Events, в которой хранится около миллиона событий, каждое из которых содержит dateStart, dateEnd, title, rating и другие биты.

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

Итак, что-то вроде ...

Топ 5 событий за 2009 год (из 199 событий)
- Событие A
- Событие B
- Событие C
- Событие D
- Событие E

Топ 5 событий за 2010 год (из 469 событий)
- Событие F
- Событие G
- Событие H
- Событие I
- Событие J

.... и т. Д.

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

Каков наиболее эффективный метод извлечения этой структуры данных из базы данных?

Заранее большое спасибо - весь день искалечил мой мозг, пытаясь разобраться с этим.

Ответы [ 2 ]

3 голосов
/ 02 марта 2011

Хорошо, давайте предположим, что вам важна только дата начала. Вы бы хотели что-то вроде:

var query = from eventInfo in db.Events
            group eventInfo by eventInfo.dateStart.Year into g
            select
            {
                Year = g.Key, // Key for the grouping
                Count = g.Count(), // Events for this year
                Top5 = g.OrderByDescending(e => e.Rating).Take(5)
            };

Честно говоря, я понятия не имею, какой SQL будет создаваться, или будет ли он хотя бы неопределенно эффективным - вы должны узнать сгенерированный SQL, а затем заглянуть в профилировщик SQL, чтобы увидеть, каков план выполнения запроса.

0 голосов
/ 02 марта 2011

Вам придется использовать ORM, есть несколько возможностей, включая (но не ограничиваясь этим) Linq-To-Sql, Entity Framework, NHibernate (я не уверен насчет поддержки LINQ здесь) и т. Д.

Все они будут переводить операторы запросов LINQ в SQL-запрос, который будет выполняться в базе данных, и будут возвращать только ту информацию, которая вам нужна или запрошена.

...