Эффективный поиск списков через веб-сервисы - PullRequest
0 голосов
/ 04 января 2011

У меня есть WCF WebService, который использует LINQ и EF для подключения к базе данных SQL. У меня есть ASP.NET MVC интерфейс, который собирает свои данные из веб-службы.

В настоящее время имеет такие функции, как

List<Customer> GetCustomers();

По мере массового увеличения количества клиентов увеличивается объем передаваемых данных, что также снижает эффективность. Каков наилучший способ «просмотра данных» через веб-сервисы и т. Д.

Моя текущая идея - реализовать грубую систему подкачки, такую ​​как

List<Customer> GetCustomers(int start, int length);

Это, однако, означает, что мне пришлось бы копировать такой код для всех функций, возвращающих List типов. К сожалению, я не могу использовать LINQ, так как это было бы намного лучше.

Есть ли у кого-нибудь какие-либо советы или идеи относительно шаблонов, которые можно было бы реализовать "как можно лучше". Также как бы справиться с такими вещами, как заказ. То есть если я хочу упорядочить по определенному параметру, мне придется реализовать что-то сделанное на заказ для каждого типа, что кажется расточительным.

Спасибо

Ответы [ 3 ]

1 голос
/ 04 января 2011

Единственный код, который вам нужно будет скопировать, - это подпись метода ((int start, int length) и вызов .Skip(start).Take(length). Поскольку они очень выразительны того, что вы на самом деле пытаетесь сделать, я бы не стал это рассматриватьслишком много повторений.

Еще одна вещь, которую вы, возможно, захотите рассмотреть, - это конечные точки OData , которые позволяют вам построить запрос, в комплекте с фильтрами и подкачкой страниц, на некотором подмножестве вашегоисточник данных через URL. Например, см.

1 голос
/ 04 января 2011

Я не делал этого раньше с WCF, но должно работать следующее:

  1. Определение типа DataContract, содержащего свойства start и length.
  2. Объявите его как заголовок SOAP, который будет использоваться во всех операциях извлечения данных.
  3. Напишите метод расширения на IEnumerable<T>, который принимает объект заголовка SOAP. Этот метод вернул бы enumerable.Skip(start).Take(length).
  4. Вызывать метод расширения при возврате из каждого метода извлечения данных.
0 голосов
/ 04 января 2011

Вас может заинтересовать потоковая передача ответов WCF (см. Требования для потоковой передачи ). По умолчанию сообщения буферизуются, но поток может помочь облегчить боль и вытолкнуть данные по мере их извлечения. Его очень легко настроить:

<basicHttpBinding>
    <binding name="StreamingBinding" 
        transferMode="StreamedRequest"  
        maxBufferSize="65536"
        maxReceivedMessageSize="204003200"  />
</basicHttpBinding>

<service behaviorConfiguration="behaviorConfig" name="serviceName">
    <endpoint address="http://whatever" 
        binding="basicHttpBinding" 
        bindingConfiguration="StreamingBinding" 
        contract="IServiceContract" />
</service>
...