지연된 콘텐츠 로드(WCF Data Services)

http://msdn.microsoft.com/ko-kr/library/ee358709.aspx

실버라이트에서의 사용법 : http://msdn.microsoft.com/ko-kr/blogvisualizer/ee681614

 

여기서는 WCF가 기본적으로 한번에 받을 수 있는 양을 제한 하기 때문에 페이징을 이용해서 데이터를 가져옵니다.
(예를 들어 한번에 1만건의 데이터를 가지고 올수없으니 100개씩 쪼개서 로컬에서 합칩니다)

프로젝트 구성

edmx 는 NorthwindEntities를 구성하였습니다.

Model1.edmx

 

WcfDataService1.svc

SetEntitySetPageSize : http://msdn.microsoft.com/ko-kr/library/system.data.services.dataserviceconfiguration.setentitysetpagesize.aspx

 

namespace WcfService1
{
    public class WcfDataService1 : DataService<NorthwindEntities>
    {
        // 이 메서드는 서비스 전반적인 정책을 초기화하는 데 한 번만 호출됩니다.
        public static void InitializeService(DataServiceConfiguration config)
        {
            // TODO: 규칙을 설정하여 어떤 엔터티 집합과 서비스 작업을 표시할 수 있고 업데이트할 수 있는지 등을 표시합니다.
            // 예제:
            config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
            config.SetEntitySetPageSize("Customers", 8); //Customers 데이터를 8개씩 끊어서 가져옵니다.
            config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
        }
    }
}

페이징으로 불러오기

MainWindow.xaml.cs


namespace WebServicePager
{
    /// <summary>
    /// MainWindow.xaml에 대한 상호 작용 논리
    /// </summary>
    public partial class MainWindow : Window
    {


        public MainWindow()
        {
            InitializeComponent();
            ServiceReference1.NorthwindEntities context = new ServiceReference1.NorthwindEntities(new Uri("http://localhost:50764/WcfDataService1.svc"));


            //일반적으로 가져오는 방식
            //var query = from c in ne.Customers
            //            select c;
            //this.dataGrid1.ItemsSource = query.ToList();


            //여기서부터는 페이징을 통해서 가져오는방법
            List<ServiceReference1.Customers> pagerCustomer = new List<ServiceReference1.Customers>();
            DataServiceQueryContinuation<ServiceReference1.Customers> token = null;
            int pageCount = 0;
            try
            {
 
                QueryOperationResponse<ServiceReference1.Customers> response =
                    context.Customers.Execute() as QueryOperationResponse<ServiceReference1.Customers>;

                do
                {
                    Console.WriteLine("Page {0}:", pageCount++);
                    if (token != null)
                    {
         
                        response = context.Execute<ServiceReference1.Customers>(token)
                            as QueryOperationResponse<ServiceReference1.Customers>;
                    }
                    pagerCustomer.AddRange(response.ToList());
                }
                while ((token = response.GetContinuation()) != null);

                this.dataGrid1.ItemsSource = pagerCustomer;
            }
            catch (DataServiceQueryException ex)
            {
                throw new ApplicationException(
                    "An error occurred during query execution.", ex);
            }

        }
    }
}
좀더 쉽게 사용하기
제가 만든거기때문에 최적화 안됨( 발빼기 ㅋ)
 
            //여기서부터는 페이징을 통해서 가져오는방법
            PagerService.NorthwindEntities __ContextPager 
                = new PagerService.NorthwindEntities(new Uri("http://localhost:56323/PagerWcfDataService.svc"));
            DataServicePager<PagerService.Categories> pager 
                = new DataServicePager<PagerService.Categories>(this.__ContextPager);
 
            List<PagerService.Categories> list = pager.List();
            this.dataGrid1.ItemsSource = list;
            this.label1.Content = list.Count.ToString();

 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Services.Client;

namespace 테스트용
{
    /// 
    /// WCF 서비스에서 config.SetEntitySetPageSize("Customers", 10); 
    /// 설정되있을때 페이징으로 가지고 오는 메소드 입니다.
    /// 
    /// WCF DataSerive애 속해있는 테이블 명
    public class DataServicePager where T : class
    {
        private string __Table { set; get; }
        private Type __Type;
        
        DataServiceQueryContinuation token = null;
        int pageCount = 0;
        private DataServiceContext __DataServiceContext;

        public DataServicePager(DataServiceContext dataServiceContext)
        {
            this.__Type = typeof(T);
            this.__DataServiceContext = dataServiceContext;
        }

        public List List()
        {
            List __PagerObjectList = new List();
            try
            {
                Uri uri = new Uri(string.Format("{0}/{1}", __DataServiceContext.BaseUri.ToString(), this.__Type.Name));
                QueryOperationResponse response = __DataServiceContext.Execute(uri) as QueryOperationResponse;
                do
                {
                    Console.WriteLine("Page {0}:", pageCount++);
                    if (token != null)
                    {
                        response = __DataServiceContext.Execute(token)
                            as QueryOperationResponse;
                    }

                    __PagerObjectList.AddRange(response.ToList());
                }
                while ((token = response.GetContinuation()) != null);
            }
            catch (Exception ex)
            {
                throw new Exception("Ge tData ServiceList Error :" + ex.Message);
            }
            return   __PagerObjectList.ToList();
        }
    }
}


 

+ Recent posts