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);