Три иерархических сетки данных с WCF RIA (EF) и Silverlight - PullRequest
0 голосов
/ 02 июня 2011

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

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

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

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

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

Это будет хорошо работать. В xaml первая сетка будет привязана к набору сущностей «Клиенты» контекста услуги, вторая - к выбранному элементу первой сетки, а третья - к выбранному элементу третьей сетки.

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

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

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

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

1 Ответ

0 голосов
/ 09 июня 2011

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

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.
...