2010-04-27 102 views
1

我正在测试RIA服务。我将RIA Services库放在一起,并构建了一个自定义的DomainService(即不是实体框架域服务)。我正在从Silverlight应用程序访问该库,并且所有工作都按预期工作。我可以调用RIA服务函数并获得结果。RIA服务 - 分页

我的问题是与分页。我无法在任何地方找到在使用自定义域名服务的RIA服务上使用分页的描述。我的RIA服务正在访问专门的DAL以访问数据(并且与实体框架不兼容)。我发现的是将分页参数(即页面,页面大小)传递给RIA服务功能的指示。所以我已经完成了 - 创建了一个RIA服务函数,它为Page [index]和Page size增加了额外的参数。我正在使用DataGrid和DataPager在Silverlight中进行测试。具有分页参数的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 => x.ScheduleTemplateID)

所以;我的问题是 - 有没有人看到过这种行为 - 或者我犯了一个可怕的错误 - 如果是的话,我做错了什么?

彼得

回答

0

好的 - 好吧,这需要一些调查。我没有意识到Ria服务的一些局限性以及客户与客户之间的沟通方式。从我发现的分页信息通过基于linq的操作被提交给ria服务。在这个级别上,我不太喜欢Ria服务,但是我发现有人已经做了一些很好的工作来将通过自定义DomainService公开分页信息的库放在一起。该库可在: http://riatodal.codeplex.com/

信息对谁以及如何使用该库: ryanmwright.com/tag/ria-services

这个库是为更多的东西一般,但侧重于分页限制使用MS提供的Ria DomainServices。

Peter

0

好吧,它看起来像你做了一些混淆。我认为你的分页逻辑增加了一倍,并且你在服务器上手动分页,并且在客户端上有Domain Datasource Control分页。

您已将LoadSize属性设置为20.这会告诉RIA服务您要逐页扫描20条记录中的数据。因此,如果底层域操作ddsScheduleTemplates返回50条记录,则您将获得三个页面,并且域数据源控件将自动附加.Take(20).Skip(##)以将结果集一次过滤为仅一个页面。

但是,它也显示您已将参数添加到您的域操作以支持分页,因为您有参数PagePageSize。我假设如果你通过Page=2PageSize=20,你在服务器的Linq查询中追加.Skip(40).Take(20)。如果是这种情况,那么域数据源控制将认为只有20条记录,因为这是您的操作将返回的最多。所以,只会有一个页面。

如果这没有帮助,那么发布您的服务器端域操作的代码,我会看看我是否可以为您解决问题。

0

正在做的事与我试图解决的问题有关。正如我所提到的,我使用的是自定义的DomainService,因为我需要使用传统的DAL。我无法弄清楚如何让事情在分页方面有效 - 我读过的一个建议是提供自定义分页参数作为查询参数。这不太好 - 实际上根本就没有 - 可能是因为缺少PageSize - 但认为如果进行自定义分页可能不需要。

正如我在之前的评论(研究后)中提到的那样,我找到了一个很好的库,允许将遗留的DALS合并到DomainService中,并提供MS RIA提供的Entity Framework域服务。这解决了我的问题。

0

我有同样的问题,你。如果直接进入第X页,会发生什么? Datapager返回到第1页?对我来说,如果我直接进入某个页面,一切正常,但是如果我点击下一个或上一个页面,它将跳转到第1页。

1

一旦我整合了前面提到的Legecay DAL库,所有工作都正常。查看图书馆 - 它很容易使用(但有一些阅读/审查,以加快速度)。还要确保您的RIA服务已正确配置为分页。从我已阅读和发现的内容 - 在寻呼机和域数据源中设置页面大小是正确操作所必需的。 ria服务调用还需要一个计数操作(对于特定的实体对象),它也返回MAX记录计数(如果没有这样做,那么可能会出现像您提到的情况 - 域数据源不知道要分页的总记录通过 - 所以它可能只是开始,因为它没有足够的信息 - 这很明显,因为寻呼机将不会显示适当的最大页数或将显示1或0的最大页面)。

彼得

+0

这将是伟大的,如果你littlebit格式化你的答案。 :) – 2012-12-04 08:56:04