diff --git a/src/EntityFrameworkCore.Projectables/Extensions/ExpressionExtensions.cs b/src/EntityFrameworkCore.Projectables/Extensions/ExpressionExtensions.cs new file mode 100644 index 0000000..c18048a --- /dev/null +++ b/src/EntityFrameworkCore.Projectables/Extensions/ExpressionExtensions.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Text; +using System.Threading.Tasks; +using EntityFrameworkCore.Projectables.Services; + +namespace EntityFrameworkCore.Projectables.Extensions +{ + public static class ExpressionExtensions + { + static ProjectableExpressionReplacer _projectableExpressionReplacer = new ProjectableExpressionReplacer(new ProjectionExpressionResolver()); + + public static Expression ExpandQuaryables(this Expression expression) + => _projectableExpressionReplacer.Visit(expression); + } +} diff --git a/src/EntityFrameworkCore.Projectables/Extensions/QueryableExtensions.cs b/src/EntityFrameworkCore.Projectables/Extensions/QueryableExtensions.cs new file mode 100644 index 0000000..fb0a5d6 --- /dev/null +++ b/src/EntityFrameworkCore.Projectables/Extensions/QueryableExtensions.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using EntityFrameworkCore.Projectables.Services; + +namespace EntityFrameworkCore.Projectables.Extensions +{ + public static class QueryableExtensions + { + public static IQueryable ExpandQuaryables(this IQueryable query) + => query.Provider.CreateQuery(query.Expression.ExpandQuaryables()); + } +} diff --git a/src/EntityFrameworkCore.Projectables/Infrastructure/Internal/CustomQueryTranslationPreprocessorFactory.cs b/src/EntityFrameworkCore.Projectables/Infrastructure/Internal/CustomQueryTranslationPreprocessorFactory.cs index 7809b8b..d561df4 100644 --- a/src/EntityFrameworkCore.Projectables/Infrastructure/Internal/CustomQueryTranslationPreprocessorFactory.cs +++ b/src/EntityFrameworkCore.Projectables/Infrastructure/Internal/CustomQueryTranslationPreprocessorFactory.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; +using EntityFrameworkCore.Projectables.Extensions; using EntityFrameworkCore.Projectables.Services; using Microsoft.EntityFrameworkCore.Query; @@ -13,7 +14,6 @@ namespace EntityFrameworkCore.Projectables.Infrastructure.Internal { readonly IQueryTranslationPreprocessorFactory _decoratedFactory; readonly QueryTranslationPreprocessorDependencies _queryTranslationPreprocessorDependencies; - readonly ProjectableExpressionReplacer _projectableExpressionReplacer = new(new ProjectionExpressionResolver()); public CustomQueryTranslationPreprocessorFactory(IQueryTranslationPreprocessorFactory decoratedFactory, QueryTranslationPreprocessorDependencies queryTranslationPreprocessorDependencies) { @@ -22,21 +22,19 @@ namespace EntityFrameworkCore.Projectables.Infrastructure.Internal } public QueryTranslationPreprocessor Create(QueryCompilationContext queryCompilationContext) - => new CustomQueryTranslationPreprocessor(_decoratedFactory.Create(queryCompilationContext), _queryTranslationPreprocessorDependencies, queryCompilationContext, _projectableExpressionReplacer); + => new CustomQueryTranslationPreprocessor(_decoratedFactory.Create(queryCompilationContext), _queryTranslationPreprocessorDependencies, queryCompilationContext); } public class CustomQueryTranslationPreprocessor : QueryTranslationPreprocessor { readonly QueryTranslationPreprocessor _decoratedPreprocessor; - readonly ProjectableExpressionReplacer _projectableExpressionReplacer; - public CustomQueryTranslationPreprocessor(QueryTranslationPreprocessor decoratedPreprocessor, QueryTranslationPreprocessorDependencies dependencies, QueryCompilationContext queryCompilationContext, ProjectableExpressionReplacer projectableExpressionReplacer) : base(dependencies, queryCompilationContext) + public CustomQueryTranslationPreprocessor(QueryTranslationPreprocessor decoratedPreprocessor, QueryTranslationPreprocessorDependencies dependencies, QueryCompilationContext queryCompilationContext) : base(dependencies, queryCompilationContext) { _decoratedPreprocessor = decoratedPreprocessor; - _projectableExpressionReplacer = projectableExpressionReplacer; } public override Expression Process(Expression query) - => _decoratedPreprocessor.Process(_projectableExpressionReplacer.Visit(query)); + => _decoratedPreprocessor.Process(query.ExpandQuaryables()); } } \ No newline at end of file