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部分放入等式中。 我一询问
https://localhost:51025/tables/todoitem?$expand=Numbers
代替
https://localhost:51025/tables/todoitem
它神奇地出现了。 现在我如何在客户端API中遇到这个问题? 更新我使用此代码在客户端管理它
var json = await App.MobileService.GetTable("TodoItem") .ReadAsync("$expand=Numbers"); JsonConvert.DeserializeObject(json.First.ToString());
但必须有更好的方法
也可以通过在客户端上添加处理程序来实现它:
var client = new MobileServiceClient("https://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
上述就是C#学习教程:Azure移动服务C#不会返回子实体分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/984411.html