Службы данных WCF - ограничение связанных объектов, возвращаемых на основе критериев - PullRequest
0 голосов
/ 28 декабря 2010

У меня есть граф объектов, состоящий из базового объекта сотрудника и набора связанных объектов сообщений.

Я могу вернуть объекты сотрудника на основе критериев поиска по свойствам сотрудника (например, команде) и т. Д. Однако, если развернуть сообщения, я получу полный набор сообщений обратно.Я хотел бы иметь возможность либо принимать первые n сообщений (т.е. ограничивать 10 самыми последними), либо в идеале использовать диапазон дат для объектов сообщений, чтобы ограничить количество возвращаемых сообщений.

До сих пор я не смог найти способ сделать это: я получаю ошибку, если пытаюсь отфильтровать свойства сообщения (& $ filter = employee / message / StartDate выдает ошибку "> Нет свойства 'StartDate' в типе 'System.Data.Objects.DataClasses.EntityCollection`1).

Попытка использования Top в объекте, связанном с сообщением, также не работает.

Я также попытался использовать расширение WebGet, которое принимает строковый список идентификаторов сотрудников. Это работает, пока список не становится слишком длинным, а затем происходит сбой из-за слишком длинного URL-адреса (возможно, при таком подходе можно настроить механизм подкачки)...

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

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

Спасибо! M.

1 Ответ

0 голосов
/ 01 января 2011

Похоже, что единственный реальный способ сделать это - изменить направление запроса.

Так что вместо того, чтобы начинать с сотрудника, я перехожу со стороны сообщения. Вы можете отфильтровать свойства сотрудника и ограничить коллекцию сообщений. Это не идеально, так как это означает повторение коллекции по возвращении, чтобы переориентировать ее на сотрудника для того, что я пытаюсь сделать, но это сработает. Асинхронная природа Silverlight и расширенного клиента, по крайней мере, означает, что хотя требуется дополнительная итерация, она все еще кажется достаточно быстрой.

Еще один интересный момент: текущая версия служб данных odata / wcf не поддерживает запросы к свойствам унаследованных классов, поэтому мне пришлось перенести свойства даты начала / окончания в базовый класс, чтобы ограничить мой поиск по ним.

http://Site/Service.svc/Messages()?&$filter=Employee/OfficeName экв 'Торонто' и (год (StartDate) экв 2010 и месяц (StartDate) ge 9)

...