【问题标题】:Loading WCF RIA Services Query results to an ObservableCollection将 WCF RIA 服务查询结果加载到 ObservableCollection
【发布时间】:2010-11-12 10:27:33
【问题描述】:

在我的 Silverlight 应用程序中,在创建 ADO.NET 实体数据模型和 WCF RIA 服务域服务类之后,在相应的 ProductService 类中,我有一个查询操作,该操作将产品实体的集合返回给客户端,如下所示:

public IQueryable<Product> GetProducts()
{
   return this.ObjectContext.Products;
}

现在我正在尝试在客户端 Silverlight 应用程序中读取它并将结果加载到 ObservableCollection:

ProductContext pcontext = new ProductContext();
ObservableCollection<Prod> prAvs = pcontext.GetProductsQuery();

但是得到一个错误:

无法隐式转换类型System.ServiceModel.DomainServices.Client.EntityQuery&lt;MyTestApp.Web.Product&gt;System.Collections.ObjectModel.ObservableCollection&lt;MyTestApp.Prod&gt;

我该如何解决这个问题?

【问题讨论】:

    标签: c# silverlight observablecollection wcf-ria-services


    【解决方案1】:

    第一个问题:

    您应该使用由 RIA 服务为您生成的客户端 Products 类,而不是您自己定义的其他类。

    例如,您应该拥有 MyTestApp.Web.Product 的集合,而不是 MyTestApp.Prod 对象的集合。

    您将在客户端项目的隐藏 Generated_Code 文件夹中找到生成的域上下文。其中将是一个 MyTestApp.Web.g.cs 文件,其中包含客户端上下文和任何数据对象(如 MyTestApp.Web.Product)。

    第二期:

    您不能只将查询强制转换为集合。

    您需要使用查询来加载实体变更集。

    var loadOperation = pcontext.Load(pcontext.GetProductsQuery());
    

    结果(加载完成时)是返回的 loadOperation 对象中的一个实体集合。您可以立即使用实体集合,但它最初是空的。

    【讨论】:

    • 谢谢,我明白你的意思了。但其实这两种方式我都尝试了很多,结果都是一样的。看来,我只是试图错误地投射结果。
    • @rem:我已经为你更新了答案。 Query 基本上是用来执行 aysnc 加载操作的,它不像方法那样被调用。
    • 谢谢!我需要将结果发送到 ObservableCollection。我如何迭代这个生成的实体集合“loadOperation”?
    • @rem: loadOperation 包含一个 Entities 成员,它在内存中已经是一个可绑定的集合。要将其转换为另一种类型的集合(例如 ObservableCollection),您需要对其进行迭代并将它们逐个添加到新集合中(由于某种原因,ObservableCollection 没有 AddRange)。
    猜你喜欢
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多