【发布时间】:2019-09-27 15:49:19
【问题描述】:
我正在尝试将以下 LINQ 查询转换为表达式树
var queryActivity = uow.PromoActivityMeasuresRepository.ToQueryable();
var queryMeasure = uow.PromoMeasuresRepository.ToQueryable();
queryActivity.Where(pa => pa.WorkSpaceId == 28 &&
!queryMeasure.Any(pm => pm.WorkSpaceId == pa.WorkSpaceId &&
pm.Organization == pa.Organization &&
pm.MeasureCode == pa.MeasureCode));
我已经能够获得与简单约束相关的表达式,但现在我被困在如何创建与 queryMeasure.Any 相关的表达式
有代码
//I've translated pm.WorkSpaceId == pa.WorkSpaceId
var childParameter = Expression.Parameter(childEntityType, "pa");
var parentParameter = Expression.Parameter(validatingEntityType, "pm");
var parentWorkSpace = Expression.Property(parentParameter, "WorkSpaceId");
var childWorkSpace = Expression.Property(childParameter, "WorkSpaceId");
var parentChildWorkSpaceConstraint = Expression.Equal(parentWorkSpace, childWorkSpace);
还有代码
// I've translated pm => pm.WorkSpaceId == pa.WorkSpaceId &&
// pm.Organization == pa.Organization &&
// pm.MeasureCode == pa.MeasureCode)
Expression logicalAnd = null;
foreach (var field in FKChildEntity.Value.Fields)
{
var parentLeft = Expression.Property(parentParameter, field);
var childRight = Expression.Property(childParameter, field);
var parentChildConstraint = Expression.Equal(parentLeft, childRight);
if (logicalAnd == null)
{
logicalAnd = Expression.AndAlso(parentChildWorkSpaceConstraint, parentChildConstraint);
continue;
}
//parentConstraints.Add(parentChildConstraint);
logicalAnd = Expression.AndAlso(logicalAnd, parentChildConstraint);
}
问题在这里...
我无法理解如何在 NegateExpression 中调用 queryMeasure.Any 来使用
var parentDelegateType = typeof(Func<,>).MakeGenericType(validatingEntityType, typeof(bool));
var parentPredicate = Expression.Lambda(parentDelegateType, logicalAnd, parentParameter);
var promoMeasuresParameter = Expression.Constant(dataRepository, dataRepository.GetType());
var AnyMethod = Expression.MakeMemberAccess(promoMeasuresParameter, promoMeasuresParameter.GetType().GetMember("Any").FirstOrDefault());
var parentQueryable = dataRepository.GetType().InvokeMember("ToQueryable", BindingFlags.InvokeMethod, null, dataRepository, null);
var collectionParameter = Expression.Parameter(parentQueryable.GetType(), "parentCollection");
var AnyMethodExpression = Expression.Call(parentQueryable.GetType(), "Any", null , parentPredicate);
var negateExpression = Expression.Negate(AnyMethodExpression);
我可以问你们一些关于如何进行的提示吗?
谢谢大家
【问题讨论】:
-
我强烈推荐使用 LINQPad 并使用
Dump方法。您可以在变量中创建LambdaExpression<>,将其转储出来,看看它是如何形成的。 -
你想用
AnyMethod完成什么?这不是您为方法获得MethodInfo的方式(扩展方法是类中的静态方法)。您需要为Queryable.Any致电GetMethod。 -
你为什么打电话给
ToQueryable()?uow.PromoActivityMeasuresRepository不是已经是IQueryable了吗? -
Any()是Enumerable/Queryable类上的静态扩展方法,而不是parentQueryable类型上的方法。
标签: c# .net linq lambda expression-trees