Proper code reuse

This commit is contained in:
Koen Bekkenutte
2021-06-04 05:02:43 +08:00
parent 459ca9c976
commit ce9ed10f8a
3 changed files with 37 additions and 6 deletions
@@ -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);
}
}
@@ -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<TModel> ExpandQuaryables<TModel>(this IQueryable<TModel> query)
=> query.Provider.CreateQuery<TModel>(query.Expression.ExpandQuaryables());
}
}
@@ -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());
}
}