Дерево выражения LINQ: вызов любого метода для DbSet - PullRequest
1 голос
/ 27 сентября 2019

Я пытаюсь перевести следующий запрос 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);

Могу ли я попросить кого-то из вас несколько советов о том, как действовать?

Спасибо всем

...