Как я могу отправить иерархические данные через odata v2?

Используя WCF Data Services 4.0, я не могу вернуть иерархические данные. У меня есть класс Employee, у которого есть коллекция EquipmentIds. Эти идентификаторы оборудования теряются по сети. Вот мой код:

public class ODataV2 : DataService<ODataV2Model>
{
    public static void InitializeService(DataServiceConfiguration config)
    {
        config.UseVerboseErrors = true;
        config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
    }
}
public class ODataV2Model
{
    public ODataV2Model()
    {
        Employees = new List<Employee>{
            new Employee { Id = 1, Name="Doug", EquipmentIds = new List<Equipment> { new Equipment { Id = 1 },new Equipment { Id = 2 } }.AsQueryable()},
            new Employee { Id = 2, Name= "George", EquipmentIds = new List<Equipment> {new Equipment { Id = 3}, new Equipment { Id = 5} }.AsQueryable() }
        }.AsQueryable();
    }
    public IQueryable<Employee> Employees { get; private set; }
    public IQueryable<Equipment> EquipmentIds { get; private set; }
}
[DataServiceKey("Id")]
public class Employee
{
    public int Id { get; set; }
    public string Name { get; set; }
    public IQueryable<Equipment> EquipmentIds { get; set; }
}
[DataServiceKey("Id")]
public class Equipment
{
    public int Id { get; set; }
}

Когда я запускаю на нем LinqPad, я получаю следующее: Employees with 0 EquipmentIds

У меня должны быть обе коллекции EquipmentId со значением 2, но у меня 0. Я не получаю сообщения об ошибке, но данные никогда не доходят до клиента.

Я перешел на WCF Data Services v 5.0, и он успешно работает на стороне .NET, но я потерял возможность выполнять запросы с помощью LinqPad. Есть ли способ, чтобы это работало в версии 4.0?

Если нет, есть ли способ обновить LinqPad для распознавания odata v3 (WCF Data Services 5.0)?


person DougJones    schedule 21.04.2012    source источник
comment
Вам не хватает расширения? (что-то вроде Employees.Expand(EquipmentIds))   -  person Pawel    schedule 22.04.2012


Ответы (1)


Запрос ~/Employees будет включать только объекты Employee, а не какое-либо содержимое свойств навигации. Это необходимо для уменьшения размера полезной нагрузки. Если вы действительно хотите включить некоторые свойства навигации, просто укажите, например, ~/Employees?$expand=EquipmentIds.

person Vitek Karas MSFT    schedule 22.04.2012
comment
@Pawel Благодаря вам обоим я нашел эту ссылку MSDN, переходит к загрузке отложенного контента. Просто чтобы прокомментировать, я действительно ожидал, что когда я сделаю Employees.First().EquipmentIds, он больше не будет откладывать, но теперь я знаю. Еще раз спасибо. - person DougJones; 23.04.2012
comment
Проблема в этом случае заключается в ограничении самого LINQ. First() оценивает запрос (он не строит запрос, он принудительно выполняет его). И поэтому запрос не знает, есть ли доступ к свойству его результата. Это потребует поддержки ленивой загрузки свойств, но у этого есть проблемы с таймингами, поскольку доступ к свойствам всегда синхронен, но выполнение запроса/ответа внутри аксессора свойства потенциально может заблокировать поток на долгое время. - person Vitek Karas MSFT; 23.04.2012