c# - 如何将针对 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。
解决方案
推荐阅读
- sql - 根据列上的条件按子句分组
- python - Python使用变量作为键从dict中检索值
- google-app-engine - 应用引擎flex nodejs worker_connections错误
- javascript - Socket.io 套接字接收类型错误和数据解析器错误
- java - Java 垃圾收集器会运行吗?
- python - 我如何每天在python中创建一个变量
- arduino - 根据条件执行中断
- xcode - xcode 不构建 arm64/apple 硅通用 dylib
- javascript - 在网页上显示页面加载时间
- c# - Unity:试图让我的子弹在 X 轴上水平射击