Службы данных и прогнозы WCF. Как получить URI объекта из экземпляра проекции объекта?

Я использую DataServiceContext для загрузки некоторых проекций сущностей (у сущностей много свойств, чтобы минимизировать трафик, я загружаю только те свойства, которые необходимы в данный момент), например:

from x in ctx.Portfolios
       select new 
       {
         Id = x.Id,
         Name = x.Name,
         PortfolioName = x.PortfolioName,
         Description = x.Description,
         ValidFrom = x.ValidFrom,
         ValidUntil = x.ValidUntil
       };

Мне нужен действительный URI объекта, чтобы загрузить его для просмотра сведений.

Я пытался использовать ctx.TryGetUri(obj, out uri), но он всегда возвращает null (вероятно, из-за неотслеживающих проекций, однако я загрузил свойство PK (Id), поэтому оно не должно быть кейс).

Вопрос в том, как мне определить URI базового объекта данных, имеющего объект проекции с PK?


person Lex Lavnikov    schedule 30.08.2010    source источник


Ответы (1)


В C# анонимные типы генерируются с неустанавливаемыми свойствами (у свойств нет сеттеров). В результате клиент WCF Data Services не может их отслеживать (поскольку в этом нет никакого смысла, он не может перезаписать значение свойства во время материализации). В результате экземпляр не отслеживается. Чтобы обойти это, просто объявите неанонимный класс с нужными вам свойствами и спроектируйте его (убедитесь, что свойства устанавливаются). Обратите внимание, что анонимные типы VB имеют устанавливаемые свойства, поэтому они будут отслеживаться.

person Vitek Karas MSFT    schedule 02.09.2010
comment
Мне не нужно устанавливать загруженные свойства. Мне просто нужно получить правильный URI объекта, чтобы загрузить его полную версию (не проекцию) в другом контексте данных для редактирования. - person Lex Lavnikov; 25.11.2010
comment
Если вас интересует только URI, ничего не проецируйте, просто выберите весь объект, а затем используйте DataServiceContext.GetEntityDescriptor(), чтобы получить дескриптор объекта, в котором вы можете найти свойства SelfLink и EditLink, которые хранят URI, указывающий на этот объект (первый для чтения, второй для редактирования). - person Vitek Karas MSFT; 26.11.2010
comment
Мне нужны прогнозы для загрузки облегченного списка бизнес-объектов для отображения в пользовательском интерфейсе. Когда пользователь дважды щелкает выбранную проекцию, мне нужно загрузить полный объект (200 столбцов). - person Lex Lavnikov; 27.11.2010
comment
Тогда самый простой способ - объявить класс, который содержит только пару свойств данного объекта, и использовать его в своей проекции. Но если вы работаете в C#, вам нужно определить этот класс вручную и сделать свойства устанавливаемыми. - person Vitek Karas MSFT; 27.11.2010