Три иерархических сетки данных с WCF RIA (EF) и Silverlight

Мне было интересно, есть ли лучший способ кодирования следующего сценария. У меня есть сущность "Клиент", и у каждой сущности "Заказчик" много заказов. Каждая сущность Order имеет как минимум 1 или несколько сущностей LineItem.

Моя задача - создать экран с тремя иерархическими сетками - основная сетка отображает клиентов, первая дочерняя сетка отображает заказы, а третья отображает LineItems. Однако сетки не содержатся друг в друге.

Итак, проблема здесь в следующем:

Если я использую атрибут [Include] в навигационном свойстве Orders для клиента, а также использую атрибут [Include] в навигационном свойстве LineItems для Order, то у меня может быть следующий WebService:

public IQueryable<Customer> GetCustomersWithOrdersAndLineItems()
{
     return this.ObjectContext.Customers.Include("Orders.LineItems");
}

Это будет работать нормально. В xaml первая сетка будет привязана к набору сущностей Customers контекста службы, вторая - к выбранному элементу первой сетки, а третья - к выбранному элементу третьей сетки.

Однако это создает проблему, заключающуюся в том, что у каждого покупателя (особенно у постоянных клиентов) может быть много заказов, и каждый заказ имеет как минимум 20+ позиций. (Опять же, это для дистрибьюторского бизнеса ... заказы довольно большие!)

Итак, есть ли способ сделать это без необходимости LazyLoad для всех данных заказа и LineItem? Также, как бы вы поступили с разбиением на страницы в каждой сетке - отображать максимум 20 записей в каждой сетке?

Я думал о загрузке страницы, чтобы захватить всех клиентов и привязать к сетке клиентов. По событию «Выбранный элемент изменен» - захватить все заказы клиента. На выбранном элементе, измененном для сетки заказов - захватите все LineItems для заказа и привяжите LineItemsGrid к LineItems.

Проблема с этим подходом заключается в том, как сохранить состояние каждой страницы в сетке, если сетки имеют тот же контекст службы, что и их источник элементов? Что мне делать, чтобы обрабатывать изменение текущей страницы внутри каждой сетки?


person bleepzter    schedule 02.06.2011    source источник


Ответы (1)


Что ж, решение этого довольно простое.

Create 3 Domain Service objects in XAML.
Service 1: Auto Load on start, 20 items at a time
Service 2: Do NOT Auto Load on start, 20 items at a time.
Service 3: Do Not Auto Load on start, 20 items at a time.

Grid 1: ItemSource = Service 1, 1 Way binding to Service1.Data property
Grid 2: ItemSource = Service 2, 1 Way binding to Service1.Data property
Grid 3: ItemSource = Service 3, 1 Way binding to Service1.Data property

Pager 1: ItemSource = Service 1
Pager 2: ItemSource = Service 2
Pager 3: ItemSource = Service 3 

Service 2: Add a QueryParameter. Set parameter to the SelectedItem.PrimaryKey of Grid1 via 1 way binding. Create a service method that accepts an int/guid (whatever the primary key is) and returns the matched records (server side). Set the query name DomainService in xaml to be the name of the service method with the word "Query" appended to it.

Service 3: Add a QueryParameter. Set parameter to the SelectedItem.PrimaryKey of Grid2 via 1 way binding. Create a service method that accepts an int/guid (whatever the primary key is) and returns the matched records (server side). Set the query name of the DomainService in xaml to be the name of the service method with the word "Query" appended to it.
person bleepzter    schedule 09.06.2011