From ce9ed10f8aea71b6762bf52b748a6872600f86b0 Mon Sep 17 00:00:00 2001 From: Koen Bekkenutte <2912652+kbekkenutte@users.noreply.github.com> Date: Fri, 4 Jun 2021 05:02:43 +0800 Subject: [PATCH] Proper code reuse --- .../Extensions/ExpressionExtensions.cs | 18 ++++++++++++++++++ .../Extensions/QueryableExtensions.cs | 15 +++++++++++++++ ...ustomQueryTranslationPreprocessorFactory.cs | 10 ++++------ 3 files changed, 37 insertions(+), 6 deletions(-) create mode 100644 src/EntityFrameworkCore.Projectables/Extensions/ExpressionExtensions.cs create mode 100644 src/EntityFrameworkCore.Projectables/Extensions/QueryableExtensions.cs 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