当前位置: 首页 > web开发 > Silverlight > 正文

使用LINQ和ADO.NET创建Silverlight程序(5)

时间:2011-10-23 51CTO 黄永兵 译

例3 将结果添加到集合中

void OnLoadComplete(IAsyncResult result)
{
  //为查询获取一个引用
   DataServiceQuery productQuery =
     (DataServiceQuery)result.AsyncState;
 
  try
  {
    //获得结果并将其添加到集合中
    List products =  productQuery.EndExecute(result).ToList();
 
  }
  catch (Exception ex)
  {
    if (HtmlPage.IsEnabled)
     {
      HtmlPage.Window.Alert("Failed to retrieve data: " + ex.ToString ());
    }
  }
 
}

如果你以前还没有处理过LINQ,理解这些模型可能就非常困难,在写本文的时候,除了在异步包中执 行LINQ(如ThreadPool和BackgroundWorker)外,还没有关于异步LINQ很好的模型,Silverlight需要所 有的请求都是异步的,因此在使用ADO.NET Data Service客户端库时需要使用这个模型。

载入相关实体

ADO.NET Data Service也允许你选择如何载入相关的实体,在前面的例子中,我是从服务器中载入 Products(产品)的,每个产品与供应商都有一个关系。使用前面的LINQ查询,我们只检索了产品,如果 我还想显示供应商和分类信息,我们可以按需载入相关信息,也可以在原始查询中明确地从服务器去检索 ,这两种技术各有各的优势,但如果你清楚地知道需要显示哪些信息,明确地载入可能更有效,如果你只 想为一些实体载入数据,使用按需检索可能会更好。

默认情况下,如果你没有明确地载入属性,关系属性(如产品供应商)就是空的,为便于按需载入, DataServiceContext类有一个BeginLoadProperty方法(遵循相同的异步模式)可以指定源实体,属性名 和callback。

public void LoadSupplierAsync(Product theProduct)
{
TheContext.BeginLoadProperty(theProduct,
"Supplier",
new AsyncCallback (SupplierLoadComplete),
null);
}

public void SupplierLoadComplete (IAsyncResult result)
{
TheContext.EndLoadProperty(result);
}

调用EndLoadProperty后,属性和相关的实体就被正确地载入,在许多情况下,你可能想在原始查询中 明确地载入它们,因为如此,LINQ提供者支持Expand扩展方法,这个方法允许你指定属性的名称路径便于 查询执行时载入它们,Expand方法在LINQ查询的from子句中使用,它告诉提供者视图载入这些相关实体, 例如,如果你使用Expand方法改变了Category 和 Supplier原始查询,在原始查询执行期间,我们的对象 将会载入这些相关实体:

var qry =
from p in TheContext.Products.Expand("Supplier").Expand("Category")
orderby p.ProductName
select p;

如果你使用ADO.NET Data Service读取数据,知道如何创建一个查询,运行它,载入你想要的相关实 体。如果你需要真实地修改数据,只需要将你的新数据绑定到你的Silverlight控制器即可。