2010-12-29 4 views
4

я получил следующий запрос LINQ к моей IQueryable службеLinq к SQL - Как получить общее количество результатов при пейджинге без двух запросов

Dim eventcount = EventService.QueryEvents().Count 
Dim eventlist = EventService.QueryEvents().Skip((page - 1) * 5).Take(5).ToList 

Но мне интересно, если есть способ сделать это без двух вызовов в базу данных?

+0

Я думаю, что NHibernate - единственная ORM, которая может это сделать, с CreateMultiQuery и Future's. Обе функции не в L2S, EF, LightSpeed. (не знаю о SubSonic или какой-либо другой ORM) – Phill

ответ

1

Я бы подумал об использовании кэширования уровня 2 в счетчике, будучи осторожным, чтобы ключ кеширования содержал соответствующие критерии и соответствующим образом недействительным.

+0

Можете ли вы привести мне пример того, как это можно сделать? – chugh97

+0

Ознакомьтесь с кэшированием ASP.NET для данных приложения здесь http://msdn.microsoft.com/en-us/library/6hbbsfk6(v=vs.100).aspx – SteadyEddi

1

Ну, я столкнулся с той же проблемой некоторое время назад, а затем я придумал LINQ для SP =). Сделайте и SP, и опустите это в свои сущности и используйте его. вы можете написать Sp в соответствии с вашими потребностями, например, потянуть ваши записи и колонку с общей записью. Это проще и быстрее по сравнению с тем, что вы используете прямо сейчас.

у меня был тот же вопрос в прошлом году, а затем, когда он пришел к производительности, то вместо того, чтобы сделать два запроса, я переехал в LINQ к SP и сделал хранимую процедуру, и назвали его через лиц, как LINQ для хранимой процедуры =). И моя хранимая процедура сделала все и вернула только те записи, которые я хотел, и я сделал подкачку на конце хранимой процедуры, чтобы получить ограниченные данные одновременно, а не все данные в приложении.

Вы можете сделать и SP и удалить это в свои объекты и использовать его. вы можете написать Sp в соответствии с вашими потребностями, например, потянуть ваши записи и полные записи также в качестве столбца. Подумайте, есть ли 1000K записей из 100 таблиц. Медленная производительность? вы можете сделать это на Linq to SQL, создав Sp на уровне базы данных и вызывая сущности. Это будет намного быстрее, чем тот, который вы пытаетесь достичь.)

+0

Это немного нервничает, ставя одну небольшую часть бизнес-логики за пределы моего бизнес-уровня. Мне нужно подумать об этом. Спасибо –

+0

Насколько дорогой запрос, который вы хотели бы сделать 1 запрос вместо двух, это может быть только случай преждевременной оптимизации. – Phill

+1

Никакой рок, его все о предварительной работе. представьте, если у вас есть 100K записей, то лучше всего делать это на уровне базы данных, поскольку база данных знает, как это сделать. И вы уже сказали, что у вас есть эта служба, тогда не будет такого большого изменения, что вместо вызова SP linq quesr =) – Singleton

Смежные вопросы