Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 如何使用lambda表达式创建内部/子查询_Entity Framework_Linq_Dynamic_Subquery_Expression - Fatal编程技术网

Entity framework 如何使用lambda表达式创建内部/子查询

Entity framework 如何使用lambda表达式创建内部/子查询,entity-framework,linq,dynamic,subquery,expression,Entity Framework,Linq,Dynamic,Subquery,Expression,给定以下查询(带有内部查询),需要完全动态地构建 set .Where( x => x.PersonNr == "1" && x.WeightMeasurement == set.Where(y => y.PersonNr == "1").Select(z => z.WeightMeasurement).Max() ) 作为第一步,我尝试使用linq表达式构建示例。然而,我面临以下问题。请帮帮我: Expression callSet

给定以下查询(带有内部查询),需要完全动态地构建

set
  .Where(
    x => x.PersonNr == "1" && 
    x.WeightMeasurement == set.Where(y => y.PersonNr == "1").Select(z => z.WeightMeasurement).Max()
  )
作为第一步,我尝试使用linq表达式构建示例。然而,我面临以下问题。请帮帮我:

Expression callSetSelect = Expression.Call(typeof(DynamicQueryableExtensions), "Select", new[] { dtoType, typeof(string) }, callSetWhere, lambdaSelect); 
例外情况:

System.InvalidOperationException:类型“System.Linq.Enumerable”上的泛型方法“Select”与提供的类型参数和参数不兼容。如果方法是非泛型的,则不应提供类型参数

查询是使用表达式生成的

// x
ParameterExpression personOuterWhere = Expression.Parameter(dtoType, "x");
// x.PersonNr
MemberExpression personOuterPersonNr = Expression.Property(personOuterWhere, "PersonNr");
// x.WeightMeasurement
MemberExpression personWeightMeasurement = Expression.Property(personOuterWhere, "WeightMeasurement");
// x.PersonNr == "1"
Expression personOuterWherePersonNrEquals = Expression.Equal(personOuterPersonNr, Expression.Constant("1"));

// y
ParameterExpression personInnerWhere = Expression.Parameter(dtoType, "y");
// y.PersonNr
MemberExpression personInnerWherePersonNr = Expression.Property(personInnerWhere, "PersonNr");
// y.PersonNr == "1"
Expression personInnerWherePersonNrEquals = Expression.Equal(personInnerWherePersonNr, Expression.Constant("1"));
// y => y.PersonNr == "1"
LambdaExpression lambdaWhere = Expression.Lambda(personInnerWherePersonNrEquals, personInnerWhere);
// .Where(y => y.PersonNr == "1")
Expression callSetWhere = Expression.Call(typeof(Enumerable), "Where", new[] { dtoType }, Expression.Constant(set), lambdaWhere);

// z
ParameterExpression personInnerSelect = Expression.Parameter(dtoType, "z");
// z.WeightMeasurement
MemberExpression personInnerSelectWeightMeasurement = Expression.Property(personInnerSelect, "WeightMeasurement");
// z => z.WeightMeasurement
LambdaExpression lambdaSelect = Expression.Lambda(personInnerSelectWeightMeasurement, personInnerSelect);
// .Select(z => z.WeightMeasurement)
Expression callSetSelect = Expression.Call(typeof(DynamicQueryableExtensions), "Select", new[] { dtoType, typeof(string) }, callSetWhere, lambdaSelect);
//// .Max()
Expression callSetMax = Expression.Call(typeof(Enumerable), "Max", new[] { typeof(object) }, callSetSelect);

// set.Where(y => y.PersonNr == "1").Select(z => z.WeightMeasurement).Max()
Expression innerQuery = Expression.Lambda(callSetMax);
// x.WeightMeasurement == set.Where(y => y.PersonNr == "1").Select(z => z.WeightMeasurement).Max()
Expression weightMeasurementEqualsInnerQuery = Expression.Equal(personWeightMeasurement, innerQuery);
// x.PersonNr == "1" && x.WeightMeasurement == set.Where(y => y.PersonNr == "1").Select(z => z.WeightMeasurement).Max()
Expression outerWhereExpression = Expression.And(personOuterWherePersonNrEquals, weightMeasurementEqualsInnerQuery);
// x => x.PersonNr == "1" && x.WeightMeasurement == set.Where(y => y.PersonNr == "1").Select(z => z.WeightMeasurement).Max()
LambdaExpression lambdaOuterWhere = Expression.Lambda(outerWhereExpression, personOuterWhere);

return set.Where(lambdaOuterWhere);