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

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

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

然后我将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; } } 

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

 protected override IQueryable Query() { return base.Query().Include(x => x.Numbers); } 

当我向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(context, Request, Services); } 

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

更新所以,正如我在下面的回答,我能够通过在$ expand中添加查询来获得服务以返回数据。 然而,现在我真的不知道让客户端将该参数添加到请求中。 它总是只返回基础数据。

  var data = await App.MobileService.GetTable() .ToListAsync(); 

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

我的错误并不是将OData部分放入等式中。 我一询问

 http://localhost:51025/tables/todoitem?$expand=Numbers 

代替

 http://localhost:51025/tables/todoitem 

它神奇地出现了。 现在我如何在客户端API中遇到这个问题? 更新我使用此代码在客户端管理它

 var json = await App.MobileService.GetTable("TodoItem") .ReadAsync("$expand=Numbers"); JsonConvert.DeserializeObject(json.First.ToString()); 

但必须有更好的方法

也可以通过在客户端上添加处理程序来实现它:

 var client = new MobileServiceClient("http://xxxxxx/", null, new ODataParameterHandler()); public class ODataParameterHandler : DelegatingHandler { protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { UriBuilder builder = new UriBuilder(request.RequestUri); builder.Query = builder.Query .Replace("expand", "$expand") .TrimStart('?'); request.RequestUri = builder.Uri; return await base.SendAsync(request, cancellationToken); } } 

用法:

 var test = await client.GetTable() .WithParameters(new Dictionary { { "expand", "Something" } }) .ToListAsync(); 

GetAllTodoItems方法如下所示,而不是重写Query方法:

 public IList GetAllTodoItems() { return context.TodoItems.Include( "Numbers" ).ToList(); } 

这是$expand hack的替代方案。 我在为自己探索Azure App Service移动应用程序时发现了它。 像你最初尝试的那样单独Include一个Include调用对我来说会更有意义。 接下来,我想弄清楚为什么不起作用。

我以为是。在gettable之后包含(x => x.Numbers)

我有同样的问题,并使用扩展帮助。 然后@carlosfigueira建议在这里处理这种情况的更好方法

我们如何在基于Dot Net的Azure移动服务中加载相关对象(Eager Loading)?

请看一看。 到目前为止,解决这个问题的最佳方法。 Supreet