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

本文介绍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。默认创建的程序包含了超链接,登陆/登出,用户注册。

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。单击添加。

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)

        {

        }

    }
4.运行项目

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条数据展示。

你可能感兴趣的:(silverlight)