我正在尝试测试ASP.NET Web API OData V4 $ filter功能。
我可以按照答案here轻松地将针对DTO的非嵌套过滤器查询映射到另一个实体,而无需使用AutoMapper。
但是我想将嵌套的过滤器查询映射到非复杂的DTO。
例如将?$filter= SubProperties/Amount eq 100
映射到Amount
类下具有SubProperties
字段的DTO,然后将其进一步映射到没有嵌套Amount
属性的目标DTO。
要获取产品?$ 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; }
}
ProductsController:
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。