【发布时间】:2017-11-12 07:17:29
【问题描述】:
所以,情况如下:我有一个来自数据库的复杂对象。我还有第二个对象(实际上是一个对象列表),我想向用户展示它可以扩展为的东西,但实际上只是我在应用程序中拥有的运行时对象..
所以,我要做的是创建一个自定义 ODataResourceSerializer 以将模型附加到正在序列化的数据中。我猜我需要重写 AppendDynamicProperties、CreateStructuralProperty、CreateResource 或 CreateSelectExpandNode,但我只是不知道是哪一个以及如何。
所以在上图中,正常的 EF/OData 设置在扩展到“RelatedPosts”b/c 时返回左侧,数据库中没有,但我想基本上在序列化时插入数据。
可能吗?
对于某些历史,在覆盖 AppendDynamicProperties 时,我已经能够添加一个全新的属性,如您在上面的屏幕截图中看到的“MyCustomProp”。但我还没有弄清楚如何添加整个对象。这是我的类扩展 ODataResourceSerializer 的代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.OData.Formatter.Serialization;
using Microsoft.OData;
using System.Web.OData;
using Microsoft.OData.Edm;
namespace Boomerang.OData
{
public class CustomODataResourceSerializer : ODataResourceSerializer
{
public CustomODataResourceSerializer(ODataSerializerProvider serializerProvider) : base(serializerProvider)
{
}
public override Microsoft.OData.ODataProperty CreateStructuralProperty(IEdmStructuralProperty structuralProperty, ResourceContext resourceContext)
{
Microsoft.OData.ODataProperty property = base.CreateStructuralProperty(structuralProperty, resourceContext);
return property;
}
public override void AppendDynamicProperties(ODataResource resource, SelectExpandNode selectExpandNode, ResourceContext resourceContext)
{
// add property
var list = resource.Properties.ToList();
list.Add(new ODataProperty() { Name = "MyCustomProp", Value = "This Thing" });
resource.Properties = list.AsEnumerable();
base.AppendDynamicProperties(resource, selectExpandNode, resourceContext);
}
public override ODataResource CreateResource(SelectExpandNode selectExpandNode, ResourceContext resourceContext)
{
return base.CreateResource(selectExpandNode, resourceContext);
}
public override SelectExpandNode CreateSelectExpandNode(ResourceContext resourceContext)
{
return base.CreateSelectExpandNode(resourceContext);
}
public override void WriteObject(object graph, Type type, ODataMessageWriter messageWriter, ODataSerializerContext writeContext)
{
base.WriteObject(graph, type, messageWriter, writeContext);
}
}
}
【问题讨论】:
-
可以,提供你试过的代码
-
好的,在上面添加...
-
而不是
ODataProperty的值为"This Thing"尝试构建一个(集合)ODataComplexValue并添加它 -
rockyourteeth,你找到方法了吗?我想实现显示词汇但没有 OData 属性显示属性。 my problem@user326608 谢谢,有例子吗?
-
@flieks 在stackoverflow.com/a/36976343 底部的 utils 类中查看 'CreateComplexValue' 辅助方法
标签: c# entity-framework serialization odata