本文介绍Silverlight如何使用WCF RIA SERVICE对数据的读取。如何排序,过滤,查询,分页等。
一.创建WCF RIA SERVICE程序
1.运行VS
2.在开始菜单New—>Project
3.在项目类型选择Visual C# 然后选择Silverlight
4.在我的模板里面选择Silverlight Businese Application
5.项目名字:HRApp
项目创建后,此解决方案包含2个项目.一个是Silverlight Client项目,名字叫HRApp和一个ASP.NET WEB Application项目叫HRApp.Web。默认创建的程序包含了超链接,登陆/登出,用户注册。
1.1.设置应用程序
1.打开应用客户端程序中的MainPage.xaml
找到下面的XAML代码,此段代码是从资源文件中获取应用程序名字。
<TextBlock x:Name="ApplicationNameTextBlock" Style="{StaticResource ApplicationNameStyle}" Text="{Binding ApplicationStrings.ApplicationName, Source={StaticResource ResourceWrapper}}"/>
2.打开Asset/Resouce文件夹,然后打开ApplicationStrings.resx的资源文件。修改名字ApplicationName的值为HR Application
3.在HRApp项目新增一个Silverlight页面。名字是EmployeeList.xaml。
4.打开EmployeeList.xaml文件,在Grid标记内加入下面代码:<ScrollViewer BorderThickness="0" VerticalScrollBarVisibility="Auto" Padding="12,0,12,0" Margin="-12"> <StackPanel Margin="0,12,0,12" Orientation="Vertical" > <TextBlock Text="Employee List" Style="{StaticResource HeaderTextStyle}"/> </StackPanel> </ScrollViewer>保存此文件。
5.将EmployeeList.xaml文件拖到Views文件夹
6.打开MainPage.xaml文件,在页面Home和About连接中间插入下面XAML代码<HyperlinkButton x:Name="Link3" Style="{StaticResource LinkStyle}" NavigateUri="/EmployeeList" TargetName="ContentFrame" Content="Employee List"/> <Rectangle x:Name="Divider2" Style="{StaticResource DividerStyle}"/>7.运行程序,你可以看到刚刚做好的界面EmployeeList,和EmployeeList链接。
二.添加业务逻辑到RIA SERVICE项目
如果没有数据库AdventureWorks,可以到http://msftdbprodsamples.codeplex.com/releases/view/4004下载。
2.1:添加数据源
1.在HRApp.web项目添加一个ADO.NET Entity Data Model的项。取名为:AdventureWorks .edmx。
2.单击添加。然后会出现Entity Data Model Wizard窗体。选择 Generate from database.然后下一步。
3.展开Tables节点,然后选择Employee表。设置Model Namespace名字:AdventureWorks_DataModel。三.添加Domain Service Object和数据查询
1.在项目HRApp.web新增项,在新增窗体里选择WEB,在模板里选择Domain Service Class,取名为:OrganizationService。单击添加。
2.在Add New Domain Service Class窗口,选择Employee。单击OK。
3.在OrganizationService.cs你可以看到CRUD(新增,查询,更新,删除)的方法。
4.自定义查询方法,让返回值使用EmployeeID排序。
替换下面的代码:public IQueryable<Employee> GetEmployees() { return this.ObjectContext.Employees; }为
public IQueryable<Employee> GetEmployees() { return this.ObjectContext.Employees.OrderBy(e => e.EmployeeID); }5.编译整个解决方案。
6.打开项目HRApp项目Views里面的EmployeeList.xaml。
在TextBlock下面加入DataGrid,设置Name为dataGrid1,IsReadOnly为True。如下面XAML,<sdk:DataGrid Name="dataGrid1" IsReadOnly="True" MinHeight="100"></sdk:DataGrid>7.切换到ExployeeList.xaml.cs,导入命名空间
using HRApp.Web;
8.OrganizationContext是在HRApp.Web项目基于OrganizationService生成的代码。实例化OrganizationContext,加载Employee表的数据。public partial class EmployeeList : Page { OrganizationContext _OrganizationContext = new OrganizationContext(); public EmployeeList() { InitializeComponent(); this.dataGrid1.ItemsSource = _OrganizationContext.Employees; _OrganizationContext.Load(_OrganizationContext.GetEmployeesQuery()); } // Executes when the user navigates to this page. protected override void OnNavigatedTo(NavigationEventArgs e) { } }9.运行项目,单击Employee链接,打开EmployeeList页面。
四.增加自定义查询
1.打开HRApp.Web项目中的OrganizationService.cs。增加方法GetSalariedEmployees().
public IQueryable<Employee> GetSalariedEmployees() { return this.ObjectContext.Employees.Where(e => e.SalariedFlag == true).OrderBy(e => e.EmployeeID); }2.编译项目
3.打开ExployeeList.xaml.cs,修改构造函数的加载数据的实现,修改从我们刚刚的GetSalariedEmployees()方法获取。public partial class EmployeeList : Page { OrganizationContext _OrganizationContext = new OrganizationContext(); public EmployeeList() { InitializeComponent(); this.dataGrid1.ItemsSource = _OrganizationContext.Employees; _OrganizationContext.Load(_OrganizationContext.GetSalariedEmployeesQuery()); } // Executes when the user navigates to this page. protected override void OnNavigatedTo(NavigationEventArgs e) { } }5.从工具栏找到DomainDataSource控件,然后放到EmployeeList.xaml页面,放在DataGrid前面。如果没有找到DomainDataSource,可以把这控件加入到工具栏。这个控件在程序集System.Windows.Controls.DomainServices。加到EmployeeList 页面后,会自动添加命名空间。
xmlns:riaControls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.DomainServices"
6.添加下面的命名空间声明到XAML文件。
xmlns:ds="clr-namespace:HRApp.Web"7.将DomainDataSource命名为“employeeDataSource”,设置LoadSize,QueryName,AutoLoad属性。如下:
<riaControls:DomainDataSource Name="employeeDataSource" LoadSize="20" QueryName="GetSalariedEmployees" AutoLoad="True"> </riaControls:DomainDataSource>8.为DomainDataSource设置DomainContext。
<riaControls:DomainDataSource Name="employeeDataSource" LoadSize="20" QueryName="GetSalariedEmployees" AutoLoad="True"> <riaControls:DomainDataSource.DomainContext> <ds:OrganizationContext/> </riaControls:DomainDataSource.DomainContext> </riaControls:DomainDataSource>9.将DataGird1的XAML 代码
<sdk:DataGrid Name="dataGrid1" IsReadOnly="True" MinHeight="100"></sdk:DataGrid>替换成
<sdk:DataGrid Name="dataGrid1" MinHeight="100" IsReadOnly="True" Height="Auto" ItemsSource="{Binding Data, ElementName=employeeDataSource}" />10.将后台绑定数据源的代码去掉。
public partial class EmployeeList : Page { //OrganizationContext _OrganizationContext = new OrganizationContext(); public EmployeeList() { InitializeComponent(); //this.dataGrid1.ItemsSource = _OrganizationContext.Employees; //_OrganizationContext.Load(_OrganizationContext.GetSalariedEmployeesQuery()); } // Executes when the user navigates to this page. protected override void OnNavigatedTo(NavigationEventArgs e) { } }运行程序。
五.增加排序,过滤,分页
1.指定数据如何在DataGrid排序,需要加入SortDescriptors到DomainDataSource。添加下面的XAML,以升序排序VacationHours。
<riaControls:DomainDataSource Name="employeeDataSource" LoadSize="20" QueryName="GetSalariedEmployees" AutoLoad="True"> <riaControls:DomainDataSource.DomainContext> <ds:OrganizationContext/> </riaControls:DomainDataSource.DomainContext> <riaControls:DomainDataSource.SortDescriptors> <riaControls:SortDescriptor PropertyPath="VacationHours" Direction="Ascending" /> </riaControls:DomainDataSource.SortDescriptors> </riaControls:DomainDataSource>运行程序,进入EmployeeList页面,这些数据将以VacationHours字段排序,你可以点击VacationHours列来排序。
2.添加下面的XAML代码,使之支持过滤。<navigation:Page xmlns:riaControls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.DomainServices" x:Class="HRApp.EmployeeList" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" xmlns:ds="clr-namespace:HRApp.Web" xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" d:DesignWidth="640" d:DesignHeight="480" Title="EmployeeList Page" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"> <Grid x:Name="LayoutRoot" Background="White"> <ScrollViewer BorderThickness="0" VerticalScrollBarVisibility="Auto" Padding="12,0,12,0" Margin="-12"> <StackPanel Margin="0,12,0,12" Orientation="Vertical" > <TextBlock Text="Employee List" Style="{StaticResource HeaderTextStyle}"/> <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,-16,0,0"> <TextBlock VerticalAlignment="Center" Text="Min Vacation Hours Filter" /> <TextBox x:Name="vacationHoursText" Width="75" FontSize="11" Margin="4" Text="0"/> </StackPanel> <riaControls:DomainDataSource Name="employeeDataSource" LoadSize="20" QueryName="GetSalariedEmployees" AutoLoad="True"> <riaControls:DomainDataSource.DomainContext> <ds:OrganizationContext/> </riaControls:DomainDataSource.DomainContext> <riaControls:DomainDataSource.SortDescriptors> <riaControls:SortDescriptor PropertyPath="VacationHours" Direction="Ascending" /> </riaControls:DomainDataSource.SortDescriptors> <riaControls:DomainDataSource.FilterDescriptors> <riaControls:FilterDescriptor PropertyPath="VacationHours" Operator="IsGreaterThanOrEqualTo" IgnoredValue="" Value="{Binding ElementName=vacationHoursText, Path=Text}" > </riaControls:FilterDescriptor> </riaControls:DomainDataSource.FilterDescriptors> </riaControls:DomainDataSource> <sdk:DataGrid MinHeight="100" IsReadOnly="True" ItemsSource="{Binding Data, ElementName=employeeDataSource}" Name="dataGrid1" /> </StackPanel> </ScrollViewer> </Grid> </navigation:Page>运行程序,在vacationHoursText输入过滤值进行过滤。
3.在DataGrid下面加上一个DataPager控件,设置PageSize属性为5和设置Source属性。
<sdk:DataPager PageSize="5" Source="{Binding Data, ElementName=employeeDataSource}" Margin="0,-1,0,0"/>