Я пытаюсь перевести следующий запрос 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);
}
А вот вопрос ...
Я не могу понять, как я могу вызвать queryMeasure.Any для использования после в NegateExpression
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);
Могу ли я попросить кого-то из вас несколько советов о том, как действовать?
Спасибо всем