2016-02-16 5 views
0

Это использование BreezeJS и контроллера Breeze для поставщика EF. У меня есть несколько связанных объектов, позвоните им Клиент, у которого есть Навигационное свойство, которое называется «Заказы», ​​которое ссылается на набор объектов заказа для этого клиента.BreezeJS количество расширенных объектов

То, что я хотел бы отобразить в пользовательском интерфейсе, - это сводка счетчиков заказов для набора клиентов, которые соответствуют поиску частичного имени. Я могу сделать это, возвращая все объекты Order, но они довольно большие объекты, и я не хочу возвращать их 100, когда мне это не нужно. Метод inlineCount(), как представляется, всегда дает счет объекта верхнего уровня (Customer), а не суб-Entities, независимо от того, где я помещаю его в оператор.

var predicate = breeze.Predicate.create('displayName', 'contains', partialName);   
return this.entityQuery.from('Customers') 
     .where(predicate) 
     .orderBy('displayName') 
     .using(this.manager) 
     .expand('Orders') 
     .execute(); 

документация предполагает, что вы можете приковать расширить в некотором роде, но я до сих пор найти синтаксис, который действителен.

В идеале, я хотел бы применить к Приказам свойство по заказу, названное Status of say 0 (неполное), а затем дать мне только количество соответствующих Соглашений. т. е. вернуть мне все объекты Customer, но для каждого из них есть соответствующий порядок заказов (а не весь список объектов Order и фильтр на стороне клиента).

Поблагодарили бы всех указателей в правильном направлении, если это возможно. Мое настоящее мышление заключается в том, что мне придется создавать собственный метод на серверном контроллере и выполнять там работу, но прежде чем я сделаю предположения о том, что OData может поддерживать, я подумал, что проверил бы здесь какое-то подтверждение.

+0

Очевидно, один вариант должен был бы получить обратно все Клиенты, которые соответствуют 1-й предикат, а затем делать другое запрашивать клиентскую сторону для всех объектов Order, которые имеют соответствующий customer.id и статус 0. До сих пор это довольно медленно, хотя, когда есть много клиентов, соответствующих имени, так что ищите предлагаемые варианты – mcr

ответ

1

До сих пор это мой лучший подход (возможно, кто-то может исправить меня, если есть лучший способ).

На сервере, добавьте этот метод:

public IQueryable<object> CustomerSummaries() 
    { 
    return Context.Customers.Select(p => new 
              { 
              Customer = p, 
              ActiveOrderCount = p.Orders.Count(o => o.Status == 1) 
              }); 
    } 

Тогда на стороне клиента:

 var predicate = breeze.Predicate.create('customer.displayName', 'contains', partialName); 

    return this.entityQuery.from('CustomerSummaries') 
     .where(predicate) 
     .using(this.manager) 
     .execute(); 
Смежные вопросы