РИА Услуги - Разбивка на страницы - PullRequest
1 голос
/ 27 апреля 2010

Я тестирую услуги RIA. Я собрал библиотеку RIA Services и создал собственный DomainService (т.е. не доменную службу Entity Framework). Я получаю доступ к библиотеке из приложения Silverlight, и все работает, как ожидалось. Я могу вызвать сервисные функции RIA и получить результаты.

Моя проблема с нумерацией страниц. Я нигде не могу найти описание использования нумерации страниц в службе RIA, использующей пользовательские службы домена. Моя служба RIA получает доступ к специализированному DAL для доступа к данным (и не совместима с Entity Framework). То, что я нашел, было указанием передать параметры нумерации страниц (то есть страницу, размер страницы) в функцию RIA Service. Так что я сделал именно это - создал сервисную функцию RIA, которая принимает дополнительные параметры для Page [index] и размера страницы. Я тестирую это в Silverlight, используя DataGrid и DataPager. Служба RIA с параметрами разбивки на страницы вызывается (и возвращает данные), а DataGrid заполняется. У меня проблема, когда я иду на другую страницу. Происходит то, что служба RIA вызывается дважды. Первый раз с правильными параметрами (то есть с правильным индексом страницы), затем снова с нулевым индексом страницы). То есть всегда сбрасывается на первую страницу. Я не понимаю, почему это происходит; Я верю, что все собрал правильно (надеюсь). Ниже приведен скрипт XAML:

<riaControls:DomainDataSource 
    Name="ddsScheduleTemplates"                         
    LoadSize="20" 
    QueryName="GetPagedScheduleTemplates"
    AutoLoad="True"
>

    <riaControls:DomainDataSource.DomainContext>
        <ds:ScheduleEngineDomainContext/>
    </riaControls:DomainDataSource.DomainContext>

    <riaControls:DomainDataSource.QueryParameters>
        <riaControls:Parameter ParameterName="UserLogonName" Value="admin" />
        <riaControls:Parameter ParameterName="UserPassword" Value="admin" />
        <riaControls:Parameter ParameterName="Page" Value="{Binding ElementName=dpScheduleTemplates, Path=PageIndex}" />
        <riaControls:Parameter ParameterName="PageSize" Value="{Binding ElementName=dpScheduleTemplates, Path=PageSize}" />
    </riaControls:DomainDataSource.QueryParameters>

</riaControls:DomainDataSource>

<StackPanel>

    <dg:DataGrid 
        Name="ScheduleTemplatesGrid" 
        MinHeight="100" 
        MaxHeight="300"
        IsReadOnly="True" 
        ItemsSource="{Binding ElementName=ddsScheduleTemplates, Path=Data}"
    />

    <dg:DataPager 
        x:Name="dpScheduleTemplates" 
        PageSize="10"
        Source="{Binding ElementName=ddsScheduleTemplates, Path=Data}"
        PageIndexChanged="dpScheduleTemplates_PageIndexChanged" 
    />

</StackPanel>

Я изменил приведенный выше скрипт для вызова общей функции загрузки (GetPagedScheduleTemplates - возвращает все записи) и скорректировал список QueryParameters для этой функции. DataGrid загружается правильно - и нумерация страниц работает правильно.

Это смутило меня - похоже, DataPager требовал, чтобы все данные были загружены, чтобы он работал должным образом, - но я провел тест, в котором я загрузил все данные в операции постраничного запроса; (то есть настройка свойств пагинации и вызов версии пагинации сервисной функции RIA), но DataGrid все еще сбрасывается.

Примечание: я прочитал, что DataPager требует упорядочить список возврата - так я и сделал - но это не влияло на работу - пейджинг всегда сбрасывается на страницу 1 - ниже приводится список возврата из сервисной функции RIA newList.ToArray (). AsQueryable (). OrderBy (х => x.ScheduleTemplateID)

Итак, мой вопрос - кто-нибудь видел такое поведение - или я совершаю ужасную ошибку - если да, то что я делаю неправильно?

Peter

Ответы [ 5 ]

1 голос
/ 20 декабря 2010

Как только я интегрировал библиотеку Legecay DAL, о которой я упоминал выше, все работало правильно.Просмотрите библиотеку - она ​​проста в использовании (но есть некоторое чтение / обзор, чтобы освоиться с ней).Также убедитесь, что ваша служба RIA правильно настроена на нумерацию страниц.Из того, что я прочитал и нашел - для правильной работы требуется установка размера страницы в пейджере и источнике данных домена.Для вызова службы ria также требуется операция подсчета (для конкретного объекта сущности), которая также возвращает количество записей MAX (если этого не сделать, то могут произойти такие вещи, как вы упомянули - источник данных домена не знает общее количество записей для разбивки на страницычерез -так что он может просто начать, потому что у него недостаточно информации - это обычно очевидно, потому что пейджер не покажет правильное максимальное количество страниц или покажет 1 или ноль для максимальной страницы).

Питер

0 голосов
/ 17 декабря 2010

У меня та же проблема, что и у вас. Что произойдет, если вы перейдете непосредственно на страницу X? Datapager возвращается на страницу 1? Для меня, если я сразу перехожу на какую-то страницу, все в порядке, но если я нажимаю на следующую или предыдущую, она переходит на страницу 1.

0 голосов
/ 09 декабря 2010

Ну, похоже, вы сделали что-то непонятное. Я думаю, что вы удвоили свою логику подкачки, вы вручную выполняете подкачку на сервере, и у вас есть подкачка управления источником данных домена на клиенте.

Вы установили атрибут LoadSize на 20. Это говорит RIA Services, что вы хотите пролистывать данные в блоках по 20 записей за раз. Таким образом, если основная операция домена ddsScheduleTemplates возвращает 50 записей, вы получите три страницы, и элемент управления источниками данных домена автоматически добавит .Take(20) и .Skip(##), чтобы отфильтровать результирующий набор до одной страницы за раз.

Однако также представляется, что вы добавили параметры в работу своего домена для поддержки подкачки, поскольку у вас есть параметры для Page и PageSize. Я предполагаю, что если вы передадите Page=2 и PageSize=20, то добавляете .Skip(40) и .Take(20) в свой запрос Linq на сервере. Если это так, то Управление источником данных домена будет считать, что существует только 20 записей, потому что это максимальная сумма, которую вернет ваша операция. Таким образом, будет только одна страница.

Если это не поможет, тогда опубликуйте код для работы вашего домена на стороне сервера, и я посмотрю, смогу ли я решить проблему для вас.

0 голосов
/ 10 декабря 2010

То, что делалось, было связано с проблемой, которую я пытался решить. Как я уже упоминал, я использую собственный DomainService, потому что мне нужно было работать с устаревшим DAL. Я не мог понять, как заставить вещи работать в отношении нумерации страниц - одно предложение, которое я прочитал, состояло в том, чтобы предоставить пользовательские параметры подкачки в качестве параметров запроса. Это не сработало слишком хорошо - на самом деле совсем нет - может быть из-за отсутствия PageSize - но подумал, что это может не потребоваться при выполнении пользовательского подкачки страниц.

С учетом всего сказанного, как я уже упоминал в своем предыдущем комментарии (после исследования), я обнаружил прекрасную библиотеку, которая позволяет включать устаревшие DALS в DomainService и обеспечивает логику, описанную в предоставляемых MS RIA доменных службах Entity Framework. Это решило мою проблему.

0 голосов
/ 09 июля 2010

Хорошо - ну, это заняло некоторое расследование. Я не знал о некоторых ограничениях Ria Services и о том, как происходит связь с клиентом. Из того, что я обнаружил, информация о разбиении на страницы передается службе ria через операции на основе linq. Я не слишком разбираюсь в сервисах Ria на этом уровне, но я нашел кого-то, кто проделал хорошую работу по созданию библиотеки, которая предоставляет информацию о нумерации страниц через пользовательский DomainService. Библиотека доступна по адресу: http://riatodal.codeplex.com/

Информация о том, кто и как использовать библиотеку: ryanmwright.com/tag/ria-services

Эта библиотека предназначена для чего-то более общего, но фокусируется на ограничениях нумерации страниц с помощью Ria DomainServices от MS.

Peter

...