Odata Asp.NET WebApi在实体/DTO中返回json属性



My Entity QueryFilter有一个属性,该属性包含序列化的json。在QueryFilterDetailDTOController中,我想反序列化JSON,用一些数据丰富它,并用新的JSON数据返回DTO。

我希望能够直接使用丰富的JSON对象作为javascript中返回对象的属性(而不是字符串)。我怎样才能做到这一点?

我试图将表达式的类型设置为JObject,但模型生成器它抛出了一个异常(因为递归类型)。这是正确的方法,还是有更好的方法?

DTO

public class QueryFilterDetailDTO
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Context { get; set; }
    public JObject Expression { get; set; }
    public QueryFilterDetailDTO(QueryFilter queryFilter)
    {
        ID = queryFilter.ID;
        Name = queryFilter.Name;
        Description = queryFilter.Description;
        Context = queryFilter.Context;
    }
}

控制器

public class QueryFilterDetailDTOController : ODataController
{
    private readonly IQueryFilterService _service;
    public QueryFilterDetailDTOController(IQueryFilterService service)
    {
        _service = service;
    }
    [HttpGet]
    [EnableQuery(MaxNodeCount = 1000)]
    public HttpResponseMessage Get([FromODataUri] int key)
    {
        var queryFilter = _service.Find(key);
        var dto = new QueryFilterDetailDTO(queryFilter);
        dto.Expression = JObject.Parse(queryFilter.SerializedFilter);
        dto.Expression["Test"] = 1;
        return Request.CreateResponse(HttpStatusCode.OK, dto);    
    }
}

创建模型

private static IEdmModel GetModel()
{
    ODataModelBuilder builder = new ODataConventionModelBuilder();
    builder.EntitySet<QueryFilterDetailDTO>("QueryFilterDetailDTO").EntityType.HasKey(dto => dto.ID);
    builder.GetEdmModel();
}

您应该能够将JsonExtensionData用于此目的:

public class QueryFilterDetailDTO
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Context { get; set; }
    [JsonExtensionData]
    public Dictionary<string, object> Expression { get; set; }
}

扩展数据包含无法映射到c#属性的任何JSON属性的键和值。

有关更多详细信息,请参阅此处和此处。

最新更新