现在的位置: 首页 > 综合 > 正文

笔记-SILVERLIGHT使用WCF RIA SERVICE查询数据

2012年11月19日 ⁄ 综合 ⁄ 共 18163字 ⁄ 字号 评论关闭

本文介绍Silverlight如何使用WCF RIA SERVICE对数据的读取。如何排序,过滤,查询,分页等。

一.创建WCF RIA SERVICE程序

1.运行VS
2.在开始菜单New—>Project
3.在项目类型选择Visual C# 然后选择Silverlight
4.在我的模板里面选择Silverlight Businese Application
5.项目名字:HRApp
new
项目创建后,此解决方案包含2个项目.一个是Silverlight Client项目,名字叫HRApp和一个ASP.NET WEB Application项目叫HRApp.Web。默认创建的程序包含了超链接,登陆/登出,用户注册。

Sln

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。
EmployeeListPage

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链接。
createemployeelist

二.添加业务逻辑到RIA SERVICE项目

如果没有数据库AdventureWorks,可以到http://msftdbprodsamples.codeplex.com/releases/view/4004下载。
2.1:添加数据源
1.在HRApp.web项目添加一个ADO.NET Entity Data Model的项。取名为:AdventureWorks .edmx。
CreateAEDM
2.单击添加。然后会出现Entity Data Model Wizard窗体。选择 Generate from database.然后下一步。
DataConnection
3.展开Tables节点,然后选择Employee表。设置Model Namespace名字:AdventureWorks_DataModel。

choseDatabaseobjects
单击完成。
EmployeeDia
编译这个解决方案。

三.添加Domain Service Object和数据查询

1.在项目HRApp.web新增项,在新增窗体里选择WEB,在模板里选择Domain Service Class,取名为:OrganizationService。单击添加。
newdomainservice
2.在Add New Domain Service Class窗口,选择Employee。单击OK。
adddscdialog
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页面。
EmployeeListNoPage

四.增加自定义查询

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)
        {
        }
    }

4.运行项目
EmployeeListFilter

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列来排序。
EmployeeListSort
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输入过滤值进行过滤。
EmployeeFilter

3.在DataGrid下面加上一个DataPager控件,设置PageSize属性为5和设置Source属性。

<sdk:DataPager PageSize="5" Source="{Binding Data, ElementName=employeeDataSource}" Margin="0,-1,0,0"/>

运行程序。数据以每页5条数据展示。
EmployeeListPager

抱歉!评论已关闭.