演练:检索并显示域服务中的数据
本主题说明如何对 Silverlight 应用程序中的域上下文调用与要访问的域服务查询方法对应的方法,然后如何对该查询的结果应用其他筛选以限制返回或显示哪些实体。
若要检索 Silverlight 应用程序中的数据,请对域上下文调用与要使用的域服务查询方法对应的方法。例如,域服务中名为 GetProducts
的查询方法将在域上下文中有一个名为 GetProductsQuery
的对应的方法。在 Silverlight 应用程序中,调用 GetProductsQuery
,此方法将返回一个 EntityQuery 对象。
在 Silverlight 应用程序中,可以针对查询应用其他筛选以限制返回哪些实体。查询方法可返回产品表中的每个记录,但您只希望显示价格低于 100 的产品。可使用 LINQ 和 LINQ 查询运算符的子集修改从查询返回的结果。下表列出了可用的查询运算符:
Where
OrderBy
ThenBy
Skip
Take
应用了其他筛选后,在 Load 方法中将 EntityQuery 对象传递给一个参数,以执行查询并获取结果。
如果查询具有一个 QueryAttribute 且其 IsComposable 属性设置为 false,则无法在查询上应用其他筛选。一般而言,仅返回单个实体的查询会将 IsComposable 设置为 false。
可将数据绑定到任何呈现数据的 Silverlight 控件。DataGrid 控件可采用表格式呈现数据。
本演练介绍如何检索和显示域服务中的数据。它还演示如何使用可用的查询运算符来对查询应用其他筛选。
必备条件
除 WCF RIA Services 和 WCF RIA Services 工具包之外,本演练和 WCF RIA Services 文档中提供的其他演练还要求正确安装和配置 Visual Studio 2010 和 Silverlight Developer 运行时及 SDK 等必备程序。这些演练还要求安装和配置具有高级服务的 SQL Server 2008 R2 Express 以及安装 AdventureWorks OLTP 和 LT 数据库。
WCF RIA Services 的必备条件节点中的主题提供有关如何满足这些前提条件的详细说明。在继续本演练之前,请按照此处提供的说明执行操作,以确保您在执行本 RIA Services 演练时尽可能少地遇到问题。
本演练假定您已完成演练:创建 RIA Services 解决方案,并从通过此处描述的过程创建的应用程序继续。
检索和显示域服务中的数据
打开可通过完成演练:创建 RIA Services 解决方案主题中概述的指令来获取的 RIAServicesExample 解决方案。
在 Silverlight 应用程序中,打开 MainPage.xaml 的代码隐藏页面。
通过调用
GetCustomersQuery
方法创建 EntityQuery 实例。使用可用查询操作来筛选客户。
将查询对象传递给 Load 方法,并将返回值分配给 LoadOperation。
下面的代码演示如何从域服务检索客户。它将筛选电话号码以 583 开头的客户并按 LastName 的字母顺序进行排序。结果显示在 DataGrid 中。
Partial Public Class MainPage Inherits UserControl Private _customerContext As New CustomerDomainContext Public Sub New() InitializeComponent() Dim query As EntityQuery(Of Customer) query = _ From c In Me._customerContext.GetCustomersQuery() _ Where c.Phone.StartsWith("583") _ Order By c.LastName Dim loadOp = Me._customerContext.Load(query) CustomerGrid.ItemsSource = loadOp.Entities End Sub End Class
public partial class MainPage : UserControl { private CustomerDomainContext _customerContext = new CustomerDomainContext(); public MainPage() { InitializeComponent(); EntityQuery<Customer> query = from c in _customerContext.GetCustomersQuery() where c.Phone.StartsWith("583") orderby c.LastName select c; LoadOperation<Customer> loadOp = this._customerContext.Load(query); CustomerGrid.ItemsSource = loadOp.Entities; } }