繁体   English   中英

使用Dynamic Linq Core和Entity Framework 2.0创建包含列表的对象

[英]Create object containing a list using Dynamic Linq Core with Entity Framework 2.0

我有以下两节课:

public Part {
    public string PartNumber {get; set;}
    public string Description {get; set;}
    public List<Warehouse> Warehouses {get; set;}
}

public Warehouse {
    public string PartNumber {get; set;}
    public string WarehouseName {get; set;}
    public int Quantity {get; set;}
    public int ReorderPoint {get; set;}
}

使用Entity Framework Core 2.0,我已经使用一对多关系将它们关联起来。 使用Dynamic Linq Core,我试图创建一个查询,该查询返回特定零件的PartNumber,描述和所有关联仓库的列表,其中Warehouses列表中唯一的属性是WarehouseName,理想情况下是这样的:

List<string> fields = new List<string> {"PartNumber", "Description", "Warehouses.WarehouseName"};
var _dataSet = dbContext.Parts.Include(x => x.Warehouses);
var data = _dataSet.Where("PartNumber = \"Part1234\"").Select("new (" + String.Join(",", fields) + ")").ToDynamicArray();

但是我收到此错误:“类型'列表`1'中不存在属性或字段'仓库'”。 如果我做这样的事情,它可以正常工作:

var data = _dataSet.Where("PartNumber = \"Part1234\"").Select(x => new Part
{
    PartNumber = x.PartNumber,
    Description = x.Description,
    Warehouses = x.Warehouses.Select(y => new Warehouse { Warehouse = y.Warehouse }).ToList()
}).Single();

问题是,我希望它是动态的,以便用户可以传入他们想要获取的Part和Warehouse类中的字段列表,而不必修改选择以针对这些特定字段构建它。

您需要在Warehouses上支持子查询。 我将复制此答案中列出的相关步骤:

  1. ParseAggregate添加以下ParseAggregate

     Expression ParseAggregate(Expression instance, Type elementType, string methodName, int errorPos) { // Change starts here var originalIt = it; var originalOuterIt = outerIt; // Change ends here outerIt = it; ParameterExpression innerIt = Expression.Parameter(elementType, elementType.Name); it = innerIt; Expression[] args = ParseArgumentList(); // Change starts here it = originalIt; outerIt = originalOuterIt; // Change ends here ... } 
  2. SelectToList添加到IEnumerableSignatures ,并在ParseAggregate添加相应的条件:

     interface IEnumerableSignatures { ... void Select(object selector); void ToList(); ... } Expression ParseAggregate(Expression instance, Type elementType, string methodName, int errorPos) { ... if (signature.Name == "Min" || signature.Name == "Max" || signature.Name == "Select") ... } 
  3. 最后,您的查询将是:

     static void Main() { // example data var warehouses = new List<Warehouse> { new Warehouse { WarehouseName = "NY1", Quantity = 10 }, new Warehouse { WarehouseName = "NY2", Quantity = 100 } }; var parts = new List<Part> { new Part { PartNumber = "1", Description = "Hammer", Warehouses = warehouses } }; // query var result = parts .Select(@"new ( PartNumber, Description, Warehouses.Select(WarehouseName).ToList() as WarehouseNames )"); } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM