Выполнение IQueryable на другом DbContext (EF Core 3.1)

Требуется один и тот же обьект IQueryable<> применить на несколько контекстов. Знаю, что в 6 версии и ниже можно было. В Core не нашел такой возможности.

Придумал только такое решение, но оно выдает исключение:

public IQueryable<T> ConvertQuery<T>(IQueryable<T> queryToConvert, DbContext context)
{
    var expression = queryToConvert.Expression as MethodCallExpression;
    var resultExpression = ConvertExpression(expression, context);

    return (context as IDbContextDependencies).QueryProvider.CreateQuery<T>(resultExpression);

    // or without using internal EF api interface: IDbContextDependencies
    // var queryFromTargetContext = ...;
    // return queryFromTargetContext.Provider.CreateQuery<T>(resultExpression);
}

private MethodCallExpression ConvertExpression(MethodCallExpression expression, DbContext context)
{
    var args = new Expression[expression.Arguments.Count];
    expression.Arguments.CopyTo(args, 0);

    for (var i = 0; i < args.Length; i++)
    {
        if (args[i].GetType().BaseType == typeof (MethodCallExpression))
        {
            args[i] = ConvertExpression(args[i] as MethodCallExpression, context);
        }

        if (args[i].GetType() == typeof (ConstantExpression))
        {
            var castedExpression = args[i] as ConstantExpression;

            var setMethod = typeof(DbContext).GetMethod("Set").MakeGenericMethod(castedExpression.Type.GenericTypeArguments[0]);
            var valueDbSet = setMethod.Invoke(context, null);

            var asQueryable = typeof(System.Linq.Queryable).GetMethods().Where(x => x.Name == "AsQueryable")
                .ToList()[0].MakeGenericMethod(castedExpression.Type.GenericTypeArguments[0]);
            var casted = asQueryable.Invoke(null, new[] {valueDbSet });
            var constant = Expression.Constant(casted);

            args[i] = constant;
        }
    }

    return Expression.Call(expression.Method, args);
}

Exception:

{{query}}  by 'NavigationExpandingExpressionVisitor' failed. This may indicate either a bug or a limitation in EF Core. See https://go.microsoft.com/fwlink/?linkid=2101433 for more detailed information.
       at Microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
       at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor)
       at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
       at Microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
       at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor)
       at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
       at Microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
       at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor)
       at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
       at Microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
       at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor)
       at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
       at Microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
       at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor)
       at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
       at Microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
       at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor)
       at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
       at Microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
       at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor)
       at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
       at Microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
       at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor)
       at System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
       at Microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.Expand(Expression query)
       at Microsoft.EntityFrameworkCore.Query.QueryTranslationPreprocessor.Process(Expression query)
       at Microsoft.EntityFrameworkCore.Query.QueryCompilationContext.CreateQueryExecutor[TResult](Expression query)
       at Microsoft.EntityFrameworkCore.Storage.Database.CompileQuery[TResult](Expression query, Boolean async)
       at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCore[TResult](IDatabase database, Expression query, IModel model, Boolean async)
       at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass9_0`1.<Execute>b__0()
       at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQueryCore[TFunc](Object cacheKey, Func`1 compiler)
       at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQuery[TResult](Object cacheKey, Func`1 compiler)
       at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.Execute[TResult](Expression query)
       at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.Execute[TResult](Expression expression)
       at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1.GetEnumerator()
       at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
       at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)

Ответы (0 шт):