gpt4 book ai didi

c# - 嵌套 $expands 的 Asp.net WebApi OData V4 问题

转载 作者:可可西里 更新时间:2023-11-01 09:14:00 25 4
gpt4 key购买 nike

我在 Asp.net WebApi (OWIN) 上有一个 OData V4

一切都很好,除了当我尝试查询 4 ​​级 $expand 时。

我的查询如下:

http://domain/entity1($expand=entity2($expand=entity3($expand=entity4)))

我没有收到任何错误,但我的响应中没有预测最后一次展开。

更多信息:

  1. 我已将 MaxExpandDepth 设置为 10。
  2. 我所有的实体都是 EntitySets
  3. 我正在使用 ODataConventionModelBuilder
  4. 我打开了一个 SQL 分析器,可以看到查询(和结果)是正确的。它是在执行查询后发生的一些过滤器。
  5. 我在网上搜索过,但没有找到合适的内容。
  6. 我已经尝试过不同的实体 4 级别 $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 的 上创建了一个适配器。我看到在此过程中,entity4 的 $expand 存在,当 ODataResourceSerializer.CreateNavigationLink 方法在该 navigationProperty (entity4) 上被调用时,它返回 null。

我查看了源代码,我可以看到 SerializerContext.Items 的项目中不包含 entity4 并且 SerializerContext.NavigationSource 为 null .

为了具体说明版本,我使用的是 System.Web.OData,Version=6.1.0.10907

最佳答案

好的,所以我注意到问题是由于我的导航属性是 EdmUnknownEntitySet 类型并且导航属性查找返回 null(源代码附加了一个邪恶的 TODO..):

/// <summary>
/// Finds the entity set that a navigation property targets.
/// </summary>
/// <param name="property">The navigation property.</param>
/// <returns>The entity set that the navigation propertion targets, or null if no such entity set exists.</returns>
/// TODO: change null logic to using UnknownEntitySet
public override IEdmNavigationSource FindNavigationTarget(IEdmNavigationProperty property)
{
return null;
}

所以我明白我的问题出在 EdmUnknownEntitySet 上。

我深入研究了代码,发现我需要将 ContainedAttribute 添加到我的导航属性中。

由于我的解决方案是一种通用存储库,因此我已将其添加到 Startup for All 导航属性中:

builder.OnModelCreating = mb => mb.StructuralTypes.SelectMany(s => s.NavigationProperties
.Where(np => np.Multiplicity == EdmMultiplicity.Many)).Distinct().ForEach(np => np.Contained());

//......

var model = builder.GetEdmModel();

关于c# - 嵌套 $expands 的 Asp.net WebApi OData V4 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50942951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com