Возможно ли с помощью ExpressinTree построить следующий запрос? - PullRequest
0 голосов

Я написал следующий код, но ничего не вышло. Запрос

DbContext.Contacts.Where(c => DbContext.ContactIdentifiers.Any(c0 => c0.ContactId = c.Id and co.Phone = '1'))

protected Expression GetExpressionForField<T>(IQueryable<T> query, WhereFilter filter, List<InstanceRule> rules, Expression expression = null, string suffix = "")
{
    var joinExpressionParameter = Expression.Parameter(query.ElementType, suffix + "0");
    var property = Expression.Property(joinExpressionParameter, filter.Name);
    var joinExpressionBody = Expression.Equal(
        property,
        WhereExpressionService.ToConstantExpressionOfType(WhereExpressionService.TryCastFieldValueType(filter.Value, WhereExpressionService.AllowTypes[filter.Type]), WhereExpressionService.AllowTypes[filter.Type]));
    var joinExpression = Expression.Lambda(joinExpressionBody, joinExpressionParameter);
    //return Expression.Call(CollectionAny2.MakeGenericMethod(linqQuery.ElementType), linqQuery.Expression, joinExpression);
    try
    {
        var propertyParentId = Expression.Property(expression, "Id");
        var propertyId = Expression.Property(joinExpressionParameter, rules[0].LinkEntityField);
        var parentExpressionBody = Expression.Equal(propertyId, Expression.Convert(propertyParentId, typeof(Guid)));
        var propertyExpression = Expression.Lambda(parentExpressionBody, new ParameterExpression[] { joinExpressionParameter });
        var args = new object[] { joinExpressionBody, parentExpressionBody };
        var exp = (BinaryExpression)AndExpMethod.Invoke(null, args);
        var resultExpression = Expression.Lambda(exp, joinExpressionParameter);
        return Expression.Call(CollectionAny2.MakeGenericMethod(linqQuery.ElementType), linqQuery.Expression, resultExpression);
    }
    catch (Exception ex) {
        var mes = ex.Message;
        return null;
    }
}

Но результат выдает исключение:

Выражение LINQ 'DbSet .Any (c0 => c0.Value == "1" && c0.ContactId == (Guid) e.Id) 'не может быть переведено. Либо переписайте запрос в форме, которую можно перевести, либо переключитесь на оценку клиента явно, вставив вызов либо AsEnumerable (), AsAsyncEnumerable (), ToList (), либо ToListAsyn c (). См. https://go.microsoft.com/fwlink/?linkid=2101038 для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...