[英]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
上支持子查詢。 我將復制此答案中列出的相關步驟:
在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 ... }
將Select
和ToList
添加到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") ... }
最后,您的查詢將是:
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.