我有一个基于Asp.net WebApi
(OWIN
)的OData V4
。
除了尝试查询四级$expand
时出现问题外,其他都很顺利。
我的查询类似于:
http://domain/entity1($expand=entity2($expand=entity3($expand=entity4)))
我没有收到任何错误信息,但是最后一个展开在我的响应中没有被显示。
更多信息:
- 我将
MaxExpandDepth
设置为10。 - 我所有的实体都是
EntitySets
。 - 我正在使用
ODataConventionModelBuilder
。 - 我已经打开了SQL Profiler,并且可以看到查询(和结果)是正确的。它是在查询执行后发生的一些过滤。
- 我已经在网上搜索并没有找到合适的东西。
- 我尝试了不同的实体级别的
$expands
,但它们也不能正常工作。
编辑:
我重写了OnActionExecuted
:
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
base.OnActionExecuted(actionExecutedContext);
var objectContent = actionExecutedContext.Response.Content as ObjectContent;
var val = objectContent.Value;
var t = Type.GetType("System.Web.OData.Query.Expressions.SelectExpandWrapperConverter, System.Web.OData");
var jc = Activator.CreateInstance(t) as JsonConverter;
var jss = new JsonSerializerSettings();
jss.Converters.Add(jc);
var ser = JsonConvert.SerializeObject(val, jss);
}
序列化值包含entity4。
我仍然不知道哪个组件在管道中删除了entity4。
编辑#2:
我已经创建了一个适配器,覆盖了DefaultODataSerializerProvider
和所有其他ODataEdmTypeSerializer's
。我看到在过程中$expand
对于entity4存在,当调用ODataResourceSerializer.CreateNavigationLink
方法时,它返回null。
我跳进源代码,看到SerializerContext.Items
的项中不包括entity4,SerializerContext.NavigationSource
为null。
具体版本是System.Web.OData, Version=6.1.0.10907
。
Get
方法上方的EnableQueryAttribute
内部。我知道我做得正确,因为过去我曾因MaxDepth不受支持而需要将值修改为3。 - Amir PopovichEnableQueryAttribute
内部的ApplyQuery
方法后生成的IQueryable也是如此。 - Amir Popovich