Я бы поддержал ozczecho - зачем вам возвращать 10M записей? Ваши клиенты ДЕЙСТВИТЕЛЬНО захотят просеять 10 миллионов заказов? Я очень сомневаюсь в этом ....
Ограничить количество - например, диапазоны дат (все заказы с 1Q / 09) или по любым другим критериям. Тот факт, что вы можете вернуть 10M строк, не означает, что это будет хорошая идея.
Кроме того, вместе с SQL Server вы можете легко реализовать пейджинг, например, вы можете сделать так, чтобы ваш сервис WCF отправлял обратно первым, например, 100 строк, и отправьте обратно флаг, указывающий, что есть больше, и затем запросите у вашего клиента строки с 101 по 200 и т. Д. Это займет немного логики, но это сделало бы общение намного проще (и быстрее)!
Кроме того, в WCF вы должны определить максимальные размеры сообщений - обычно они составляют 64 КБ. Причиной этого является тот факт, что сообщение должно быть полностью собрано в памяти, прежде чем его можно будет передать. Представьте, что на вашем сервере работает 50 клиентов - сколько памяти вы действительно можете выделить на «сборку сообщений» на вашем сервере?
Марк
UPDATE:
Один из способов добиться пейджинга в службе - это сделать вызов, похожий на этот:
[OperationContract]
public List<Orders> GetOrders(string searchCriteria, string sortExpression,
int skipFirstRows, int takeRows)
Это основано на методах расширения .Skip () и .Take (), представленных LINQ.
В этом случае вы можете вызвать GetOrders и определить некоторые критерии поиска (которые также могут быть классом, а не просто строкой) для соответствия вашим заказам, вы можете определить, как сортировать заказы, указав sortExpression
, а затем вы сообщаете службе, что хотите пропустить первые n строк, а затем взять x строк.
Итак, звонок
List<Orders> result = GetOrders(criteria, sort, 0, 50)
извлечет первые 50 строк. Как только вы закончите, вы можете позвонить снова:
List<Orders> result = GetOrders(criteria, sort, 50, 50)
и теперь вы пропустите первые 50 строк (которые вы уже отобразили / сообщили о них), а затем возьмете следующие 50 (строки 51-100).
Конечно, если ваша служба WCF в бэкэнде использует LINQ, вы можете преобразовать это непосредственно в вызовы .Skip () и .Take () в ваших запросах LINQ! : -)
ОБНОВЛЕНИЕ 2:
Вы работаете с SQL Server 2005 или выше? Ознакомьтесь с общими выражениями таблиц (CTE), которые являются основой для работы LINQ. Это позволяет вам определять «виртуальный» вид ваших данных и выбирать только определенный раздел набора данных.
Подробнее смотрите здесь: