Azure移动服务C#不会返回子实体

Dyl*_*lan 8 c# azure odata azure-mobile-services

我真的用新的基于C#的Azure移动服务打砖墙了,它也非常简单:(我不能为我的生活得到查询操作来返回子属性值.我有todo项目的默认项目修改如下:

public class TodoItem : EntityData
{
    public TodoItem()
    {
        this.Numbers = new Collection<TodoItemNumbers>(new List<TodoItemNumbers>
        {
            new TodoItemNumbers{Value = 1},
            new TodoItemNumbers{Value = 2},
            new TodoItemNumbers{Value = 3},
            new TodoItemNumbers{Value = 4},
            new TodoItemNumbers{Value = 5},
        });
    }
    public virtual ICollection<TodoItemNumbers> Numbers { get; set; }
    public string Text { get; set; }
    public bool Complete { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后我将TodoItemNumbers类定义如下:

public class TodoItemNumbers : EntityData
{
    private int _value;

    public int Value
    {
        get { return _value; }
        set
        {
            _value = value;
            Id = value.ToString();
        }
    }

    public string TodoItemId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在TodoItemController中,我像这样重写了Query方法

protected override IQueryable<TodoItem> Query()
{
    return base.Query().Include(x => x.Numbers);
}
Run Code Online (Sandbox Code Playgroud)

当我向Fiddler发出请求时,这些都不会返回Numbers属性.在疯狂的时刻,我还修改了控制器的Initialize方法,包括:

protected override void Initialize(HttpControllerContext controllerContext)
{
    base.Initialize(controllerContext);
    myContext context = new myContext();
    context.Configuration.LazyLoadingEnabled = false;
    context.Configuration.ProxyCreationEnabled = false;
    DomainManager = new EntityDomainManager<TodoItem>(context, Request, Services);
}
Run Code Online (Sandbox Code Playgroud)

请注意,延迟加载和代理创建都已关闭.有谁知道怎么打败这个简单的场景?我感觉不到这个好的共鸣.

更新 因此,我在下面的回答中通过将$ expand添加到查询中来获得服务以返回数据.然而,现在我真的很难让客户端将该参数添加到请求中.它总是只返回基础数据.

    var data = await App.MobileService.GetTable<TodoItem>()
        .ToListAsync();
Run Code Online (Sandbox Code Playgroud)

将不返回子属性,并且结果类型上没有Include选项

Dyl*_*lan 2

我的错误是没有真正将 OData 部分放入等式中。我一询问

http://localhost:51025/tables/todoitem?$expand=Numbers
Run Code Online (Sandbox Code Playgroud)

代替

http://localhost:51025/tables/todoitem
Run Code Online (Sandbox Code Playgroud)

它神奇地出现了。现在我怎样才能在客户端 API 中看到它......? 更新 我用这段代码在客户端管理它

var json =
                    await
                        App.MobileService.GetTable("TodoItem")
                            .ReadAsync("$expand=Numbers");
JsonConvert.DeserializeObject<TodoItem>(json.First.ToString());
Run Code Online (Sandbox Code Playgroud)

但必须有更好的方法