【问题标题】:Paged Items not displaying properly with DomainCollectionView and custom DomainService使用 DomainCollectionView 和自定义 DomainService 无法正确显示分页项目
【发布时间】:2011-07-13 20:26:39
【问题描述】:

我正在开发一个 RIA 服务应用程序,但在服务器端分页和 DataGrid 中分页项目的显示方面存在问题。我正在使用自定义 DomainService,其中 PageIndex 和 PageSize 通过 Query 以及几个过滤器参数传递。

问题是我的第一页结果显示正确,但是当我翻到下一组结果时,我的项目被添加到列表的末尾,而不仅仅是显示从服务器返回的新结果。即,我的 DataGrid 正在显示从服务器返回的所有累积对象,而不是仅显示返回的最新结果页面。

首先,我使用的是 DomainCollectionView 和 DomainCollectionViewLoader:


 _context = new StudyQueryContext();
_entityList = new EntityList(_context.PortalStudies);
_loader = new DomainCollectionViewLoader(Load, LoadComplete);
PortalStudies = new DomainCollectionView(_loader, _context.PortalStudies);      

然后我有相当标准的 Load() 和 LoadComplete() 方法:


public LoadOperation Load()
{
    if (IsLoading)
    {
        return null;
    }

    IsLoading = true;
    EntityQuery q = _context.GetPortalStudyQuery(PatientsName, PatientId, AccessionNumber, PortalStudies.PageIndex, PortalStudies.PageSize);           
    return _context.Load(q);
}

private void LoadComplete(LoadOperation op)
{
    if (op.HasError)
    {
        System.Windows.MessageBox.Show(op.Error.ToString(), "Search Error", System.Windows.MessageBoxButton.OK);
        op.MarkErrorAsHandled();
    }
    else if (!op.IsCanceled)
    {
        _entityList.Source = op.Entities;
        _context.PortalCountAll(PatientsName, PatientId, AccessionNumber, CountAllComplete, null);
    }

    IsLoading = false;
}

请注意,我在 PortalCountAll 方法返回时分配 TotalItemCount。

为了完整起见,我的 DomainService Query 方法的签名如下:


[Query]
public IEnumerable&ltPortalStudy> GetPortalStudy(string patientsName, string patientId, string accessionNumber, int startIndex, int pageSize)
{ }  

我认为问题在于我如何设置 _entityList 以及在 LoadComplete() 方法中分配结果:

_entityList.Source = op.Entities;  

似乎在所有基于 LINQ 的示例中,此分配似乎只允许在 DataGrid 中显示当前结果。出于某种原因,使用自定义查询方法时似乎并非如此。

我想知道更改页面时清除 DataGrid 的首选方法是什么?我知道我可以在查询之前调用 _context.PortalStudies.Clear() 来清除结果,但这会导致页面上的项目闪烁,并且在查询从服务器返回之前不会再次填充。使用自定义 DomainService 时仅显示当前结果页面的正确方法是什么?

【问题讨论】:

  • RIA 服务和 IEnumerable 的一个主要卖点是,当生成的 LINQ 被序列化到服务器进行处理时,您可以添加过滤器和分页 客户端。您通常不需要将页面索引和页面大小作为参数传递。你能解释一下为什么要手动进行分页吗?
  • 我的搜索结果集可能有上万条结果,所以我想做服务器端的分页,而不是等待加载客户端搜索的所有结果。从 RIA 服务文档看来,使用 LINQ 时,可以在查询中使用 Skip() 和 Take() 进行服务器端分页。我使用的是自制的 ORM,并且没有 LINQ 作为接口可用,因此最简单的实现似乎是直接通过查询传递 PageSize 和 PageIndex 以进行服务器端分页。
  • 如果你不能使用 LINQ 服务器端,是的,你有一个严重的问题。 Silverlight 中所有很酷的东西都采用 LINQ。有没有机会抛弃 ORM 以支持 EF?
  • 很遗憾,不,我真的不可能为实体框架转储 ORM。

标签: silverlight ria wcf-ria-services domainservices


【解决方案1】:

在使用不支持 LINQ 的自定义 ORM 时,您可以(并且应该)传递 PageIndex 和 PageSize。它将允许您针对 ORM 进行分页,但也会使分页稍微复杂化。您需要override DomainService.Countadd a totalCount out parameter

但是,在您的情况下,错误似乎是您已将 EntitySet (_context.PortalStudies) 传递给 DCV 构造函数,而不是 EntityList (_entityList)。

【讨论】:

  • Kyle -- 感谢您的回复,这解决了我的问题!我现在感觉有点愚蠢,没有注意到 _entityList 应该与 DCV 一起使用。另外,感谢有关 totalCount out 参数的提示,我一直在对服务器进行另一次往返以获得总计数,但没有意识到可以通过这种方式完成。似乎没有太多关于使用 RIA 和自定义 ORM 的问题,希望这将帮助其他人更快地上手。
猜你喜欢
  • 2016-10-02
  • 2011-02-11
  • 1970-01-01
  • 2020-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-02
相关资源
最近更新 更多