我正在测试RIA服务。我组装了一个RIA服务库,并构建了一个自定义DomainService (即,不是实体框架域服务)。我正在从Silverlight应用程序访问库,一切都如预期的那样工作。我可以调用RIA服务函数并获得结果。
我的问题是分页。我在任何地方都找不到在使用自定义domainServices的RIA服务上使用分页的描述。我的RIA服务正在访问一个专门的DAL来访问数据(并且与实体框架不兼容)。我所发现的是将分页参数(即页面、页面大小)传递给RIA服务函数的指示。因此,我已经做到了这一点-创建了一个RIA服务函数,该函数接受页面索引和页面大小的附加参数。我正在使用DataGrid和DataPager在Silverlight中测试这一点。带有分页参数的RIA服务被调用(并返回数据),并填充DataGrid。我遇到的问题是当我转到另一个页面时。发生的情况是RIA服务被调用了两次。第一次使用正确的参数(即正确的页面索引),然后再次使用页面索引0)。即总是重置到第一页。我不明白为什么会发生这种情况;我相信我把所有的东西都放在一起了(希望如此)。以下是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=>x.ScheduleTemplateID)的返回列表
所以,我的问题是--有没有人看到过这种行为--或者我是不是犯了一个可怕的错误--如果是的话,我做错了什么?
彼得
发布于 2010-12-20 21:43:28
一旦我集成了上面提到的Legecay DAL库,所有这些都可以正常工作。回顾这个库-它很容易使用(但有一些阅读/回顾可以快速了解它)。还要确保您的RIA服务针对分页进行了正确配置。根据我所阅读和发现的内容-在页面导航和域数据源中设置页面大小是正常操作所必需的。ria服务调用还需要一个计数操作(对于特定的实体对象),该操作还返回最大记录计数(如果没有完成此操作,则可能会发生您提到的事情--域数据源不知道要通过-so分页的总记录。由于它没有足够的信息,因此可能只是从头开始--这通常很明显,因为分页浏览器不会显示适当的最大页面计数,或者最大页面显示为1或0)。
彼得
发布于 2010-07-09 21:25:33
好的--这需要一些调查。我不知道Ria Services的一些限制以及如何与客户端进行通信。根据我所发现的,分页信息是通过基于linq的操作传递给ria服务的。在这个级别上,我对Ria服务不是很了解,但我发现有人做了一些很好的工作,将一个库放在一起,通过一个自定义的DomainService公开分页信息。该库可在以下位置获得:http://riatodal.codeplex.com/
有关谁以及如何使用库的信息: ryanmwright.com/tag/ria-services
这个库用于更一般的东西,但重点放在使用MS.提供的Ria DomainServices的分页限制上。
彼得
发布于 2010-12-10 02:38:30
嗯,看起来你做了一些让人困惑的事情。我认为您已经加倍了您的分页逻辑,并且您在服务器上手动分页,并且在客户机上具有域数据源控制分页。
您已经将LoadSize属性设置为20。这将告诉RIA Services,您希望一次对包含20条记录的块中的数据进行分页。因此,如果底层的域操作ddsScheduleTemplates返回50条记录,您将获得三个页面,并且域数据源控件将自动附加.Take(20)和一个.Skip(##),以将结果集过滤到一次只有一页。
但是,由于您有用于Page和PageSize的参数,因此似乎还向域操作添加了参数以支持分页。我假设如果您传入Page=2和PageSize=20,那么您将在服务器上的Linq查询中附加一个.Skip(40)和一个.Take(20)。如果是这种情况,那么域数据源控件将认为只有20条记录,因为这是您的操作将返回的最多记录。因此,将只有一页。
如果这还不能解决问题,那就发布服务器端域操作的代码,我会看看是否可以为您解决这个问题。
https://stackoverflow.com/questions/2722416
复制相似问题