簡體   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