我有以下两个类:
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;}
}使用实体框架核心2.0,我使用一对多关系将它们关联起来。使用Dynamic Linq Core,我尝试创建一个查询,返回PartNumber、描述以及仓库列表中唯一属性为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();但我收到这个错误:“类型‘List`1’中不存在属性或字段'Warehouse‘”。如果我这样做,它工作得很好:
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类传入他们想要获取的字段列表,而不必修改select来为那些特定的字段构建它。
发布于 2019-08-22 16:16:47
您需要支持Warehouses上的子查询。我将复制this answer中列出的相关步骤
ParseAggregateExpression ParseAggregate(Expression instance,Type elementType,string methodName,int Expression)中添加以下内容{ // Change starts 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 it =;=;//更改在此结束... }Select和ToList添加到IEnumerableSignatures中,并在ParseAggregate中分别添加条件:接口IEnumerableSignatures { ...空选择(对象选择器);空ToList();... }表达式ParseAggregate(表达式实例,类型elementType,字符串methodName,整型errorPos) { ...如果(signature.Name == "Min“|| signature.Name == "Max”|| signature.Name == "Select") ... }
static void Main() { //示例数据var Warehouse =新列表{新仓库{ WarehouseName = "NY1",数量= 10 },新仓库{ WarehouseName = "NY2",数量= 100 } };var parts =新列表{ PartNumber = "1",Description = "Hammer",Warehouse =Warehouse} };//查询var结果=部件.Select(@“PartNumber (Warehouses.Select,Description,Warehouses.Select(WarehouseName).ToList() as WarehouseNames )");}
https://stackoverflow.com/questions/49823411
复制相似问题