首页 > 解决方案 > 如何将针对 DTO 的 OData 嵌套过滤器查询映射到另一个实体?

问题描述

我正在尝试测试 ASP.NET Web API OData V4 $filter 功能。

我可以根据此处的答案轻松地将针对 DTO 的非嵌套过滤器查询映射到另一个实体,而无需使用 AutoMapper。

但我想将嵌套过滤器查询映射到非复杂 DTO。

例如。映射?$filter= SubProperties/Amount eq 100到在类下具有Amount字段的 DTO,SubProperties然后将其进一步映射到具有Amount未嵌套属性的目标 DTO。

GET products?$filter=SubProperties/Amount eq 100`

产品类别:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Level { get; set; }
    public Properties SubProperties {get;set;}
}

public class Properties
{
    public double Amount{ get; set; }
}

ProductDTO 类:

public class ProductDTO
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Level { get; set; }
    public double Amount { get; set; }
}

产品控制器:

public class ProductsController : ApiController
{
    public IEnumerable<ProductDTO> Get(ODataQueryOptions<Product> options)
    {
       IQueryable<Product> products = this._products.AsQueryable();

        IEdmModel model = GetProductDTOModel();
        IEdmType type = model.FindDeclaredType(typeof(ProductDTO).ToString());
        ODataQueryOptionParser parser = new ODataQueryOptionParser(model, type, null, new Dictionary<string, string> { { "$filter", options.Filter.RawValue } });
        ODataQueryContext context = new ODataQueryContext(model, typeof(Product), options.Context.Path);
        FilterQueryOption filterMapper = new FilterQueryOption(options.Filter.RawValue, context, parser);

    }
}

当我展开选项 -> 过滤器时,它已正确映射到过滤器查询字符串并且 FilterClause 正确加载。但是在将其映射到 ProductsDTO 并扩展 filterMapper 之后,FilterClause 会引发异常,因为它没有属性 SubProperties。

标签: c#asp.net-web-apiodataautomapper

解决方案


推荐阅读