none
WCF RIA Service 问题: 网上服务器端数据分页例子不仅过于复杂而且逻辑混乱,现给出一简单/清晰的示例,供参考。 RRS feed

  • 常规讨论

  •  

    11) Web端 DomainService1.cs 文件 (注:自动生成部分,省略。。。)

    .....

            [Invoke]
            public int GetStudentRecordCount()
            {
                return this.ObjectContext.Student.Count();
            }
    ..........

    12)示例数据库结构(表名:Student)

                public string ClassName { get; set; }

                public string Course { get; set; }

                public int Id { get; set; }

                public Nullable<float> Score { get; set; }

                public string StudentName { get; set; }

    ======================================

    21)Silverlight 端 .xaml文件

    <UserControl
        xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
        x:Class="RiaTest.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
        <Grid
            x:Name="LayoutRoot"
            Background="White"
            Width="400"
            VerticalAlignment="Center"
            HorizontalAlignment="Center">
            <StackPanel
                Orientation="Vertical">
                <sdk:DataGrid
                    Height="300"
                    x:Name="DgrStudent" />
                <sdk:DataPager
                    x:Name="DpgStudent" />
            </StackPanel>
        </Grid>
    </UserControl>

    22)Silverlight 端  .C#文件

    using System;
    using System.ComponentModel;
    using System.Linq;
    using System.ServiceModel.DomainServices.Client;
    using System.Windows.Controls;
    using System.Windows.Data;
    using RIAServicesLibrary1.Web;

    namespace RiaTest
    {
        public partial class MainPage : UserControl
        {
            //DomainService1 实例
            private DomainService1 DS { get; set; }

            //类开始
            public MainPage()
            {
                InitializeComponent();
                if (!DesignerProperties.IsInDesignTool) { InitMe(); }
            }

            //初始化
            private void InitMe()
            {
                DS = new DomainService1();
                //检索记录数
                var Op = DS.GetStudentRecordCount();
                Op.Completed += GetStudentRecordCount_Completed;
                //设置分页控件的事件
                this.DpgStudent.PageIndexChanged += DpgStudent_PageIndexChanged;
            }
            //得到记录数后设置分页控件的有关属性
            private void GetStudentRecordCount_Completed(object sender, EventArgs e)
            {
                var Op = sender as InvokeOperation<int>;
                //指定分页控件的数据源
                this.DpgStudent.Source = new PagedCollectionView(Enumerable.Range(0, Op.Value));
                //指页大小
                this.DpgStudent.PageSize = 5;
                //指定页号(0开始)
                this.DpgStudent.PageIndex = 0;
            }

            //分页控件的页码发生变化处理
            private void DpgStudent_PageIndexChanged(object sender, EventArgs e)
            {
                //从服务器检索指定页的数据
                var Qry =
                    DS.GetStudentQuery()
                    .OrderBy(X => X.ClassName).ThenBy(X => X.StudentName)
                    .Skip(this.DpgStudent.PageIndex * this.DpgStudent.PageSize)
                    .Take(this.DpgStudent.PageSize);
                var Ld = DS.Load(Qry);
                Ld.Completed += GetStudentQuery_Completed;
            }
            //得到分页数据后,将数据绑定到DataGrid
            private void GetStudentQuery_Completed(object sender, EventArgs e)
            {
                var Ld = sender as LoadOperation<Student>;
                this.DgrStudent.ItemsSource = null;
                this.DgrStudent.ItemsSource = Ld.Entities;
            }
        }
    }

     

     

     

     

    通过在SqlServer Profiler中跟踪,采用此法,的却是在服务器端进行分页。

    TFSoft = Simple, Nice, Elegant

     

     

     






    2011年6月23日 16:34

全部回复

  • 你好,

    由于你发的帖子不适合问题类型,我把它更改为讨论类型。

    谢谢你的分享!


    Daoping Liu - MSFT
    2011年6月27日 2:01
    版主
  • 請教一下你的實例化和初始化我怎麼沒有辦法

    2011年8月23日 5:51
  • 1)要按如上建立数据库,建立DomainService。然后在一定可以。

    2)如果你采用本人精心研制的T4Data类库就更简单了。就用不着在服务端创建任何数据实体和DomainService。

    T4Data示例,里面有服务端和客户端分页示例。(注:TFSoft从不用WCF Ria,而是用T4Data处理后台数据库访问)

    http://211.152.41.146/T4Data/

     

    2011年8月23日 16:07