diff --git a/Orm/Xtensive.Orm/Orm/Linq/Expressions/ConstructorExpression.cs b/Orm/Xtensive.Orm/Orm/Linq/Expressions/ConstructorExpression.cs index 2cbbdb304..9bdac3b96 100644 --- a/Orm/Xtensive.Orm/Orm/Linq/Expressions/ConstructorExpression.cs +++ b/Orm/Xtensive.Orm/Orm/Linq/Expressions/ConstructorExpression.cs @@ -30,8 +30,8 @@ internal sealed class ConstructorExpression : ParameterizedExpression public override Expression BindParameter(ParameterExpression parameter, Dictionary processedExpressions) { - Func genericBinder = - e => GenericExpressionVisitor.Process(e, mapped => mapped.BindParameter(parameter, processedExpressions)); + GenericExpressionVisitor genericVisitor = new(mapped => mapped.BindParameter(parameter, processedExpressions)); + var genericBinder = genericVisitor.Process; return new ConstructorExpression( Type, Bindings.ToDictionary(kvp => kvp.Key, kvp => genericBinder(kvp.Value)), @@ -42,8 +42,8 @@ public override Expression BindParameter(ParameterExpression parameter, Dictiona public override Expression RemoveOuterParameter(Dictionary processedExpressions) { - Func genericRemover = - e => GenericExpressionVisitor.Process(e, mapped => mapped.RemoveOuterParameter(processedExpressions)); + GenericExpressionVisitor genericVisitor = new(mapped => mapped.RemoveOuterParameter(processedExpressions)); + var genericRemover = genericVisitor.Process; var result = new ConstructorExpression( Type, Bindings.ToDictionary(kvp => kvp.Key, kvp => genericRemover(kvp.Value)), @@ -61,10 +61,10 @@ public override Expression Remap(ColNum offset, Dictionary()); return (Expression) mapped; }; - var newBindings = Bindings.ToDictionary(kvp => kvp.Key, kvp => GenericExpressionVisitor.Process(kvp.Value, remapper)); - var newConstructorArguments = ConstructorArguments - .Select(arg => GenericExpressionVisitor.Process(arg, remapper)).ToArray(); - var newNativeBindings = NativeBindings.ToDictionary(kvp => kvp.Key, kvp => GenericExpressionVisitor.Process(kvp.Value, remapper)); + GenericExpressionVisitor genericVisitor = new(remapper); + var newBindings = Bindings.ToDictionary(kvp => kvp.Key, kvp => genericVisitor.Process(kvp.Value)); + var newConstructorArguments = ConstructorArguments.Select(genericVisitor.Process).ToArray(); + var newNativeBindings = NativeBindings.ToDictionary(kvp => kvp.Key, kvp => genericVisitor.Process(kvp.Value)); var result = new ConstructorExpression( Type, newBindings, @@ -82,9 +82,10 @@ public override Expression Remap(ColumnMap map, Dictionary()); return (Expression) mapped; }; - var newBindings = Bindings.ToDictionary(kvp => kvp.Key, kvp => GenericExpressionVisitor.Process(kvp.Value, remapper)); - var newConstructorArguments = ConstructorArguments.Select(arg => GenericExpressionVisitor.Process(arg, remapper)).ToArray(); - var newNativeBindings = NativeBindings.ToDictionary(kvp => kvp.Key, kvp => GenericExpressionVisitor.Process(kvp.Value, remapper)); + GenericExpressionVisitor genericVisitor = new(remapper); + var newBindings = Bindings.ToDictionary(kvp => kvp.Key, kvp => genericVisitor.Process(kvp.Value)); + var newConstructorArguments = ConstructorArguments.Select(genericVisitor.Process).ToArray(); + var newNativeBindings = NativeBindings.ToDictionary(kvp => kvp.Key, kvp => genericVisitor.Process(kvp.Value)); return new ConstructorExpression(Type, newBindings, newNativeBindings, Constructor, newConstructorArguments); } @@ -99,4 +100,4 @@ public ConstructorExpression(Type type, Dictionary bindi Constructor = constructor; } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Orm/Linq/Expressions/SubQueryExpression.cs b/Orm/Xtensive.Orm/Orm/Linq/Expressions/SubQueryExpression.cs index 782101021..bdc0ee7e0 100644 --- a/Orm/Xtensive.Orm/Orm/Linq/Expressions/SubQueryExpression.cs +++ b/Orm/Xtensive.Orm/Orm/Linq/Expressions/SubQueryExpression.cs @@ -83,8 +83,7 @@ public override SubQueryExpression Remap(ColumnMap map, Dictionary.Process(ProjectionExpression.ItemProjector.Item, mapped => { - var parametrizedExpression = mapped as ParameterizedExpression; - if (parametrizedExpression!=null && parametrizedExpression.OuterParameter==OuterParameter) + if (mapped is ParameterizedExpression parametrizedExpression && parametrizedExpression.OuterParameter==OuterParameter) return mapped.Remap(map, new Dictionary()); return (Expression) mapped; }); @@ -133,4 +132,4 @@ public SubQueryExpression(Type type, ParameterExpression parameterExpression, bo ApplyParameter = applyParameter; } } -} \ No newline at end of file +} diff --git a/Orm/Xtensive.Orm/Orm/Linq/Expressions/Visitors/GenericExpressionVisitor.cs b/Orm/Xtensive.Orm/Orm/Linq/Expressions/Visitors/GenericExpressionVisitor.cs index c017cf801..015f7200b 100644 --- a/Orm/Xtensive.Orm/Orm/Linq/Expressions/Visitors/GenericExpressionVisitor.cs +++ b/Orm/Xtensive.Orm/Orm/Linq/Expressions/Visitors/GenericExpressionVisitor.cs @@ -4,59 +4,46 @@ // Created by: Alexis Kochetov // Created: 2009.05.21 -using System; using System.Linq.Expressions; using ExpressionVisitor = Xtensive.Linq.ExpressionVisitor; -namespace Xtensive.Orm.Linq.Expressions.Visitors -{ - internal sealed class GenericExpressionVisitor : ExpressionVisitor - where T : class - { - private readonly Func genericProcessor; +namespace Xtensive.Orm.Linq.Expressions.Visitors; - public static Expression Process(Expression target, Func genericProcessor) - { - var visitor = new GenericExpressionVisitor(genericProcessor); - - if (RemapScope.CurrentContext!=null) - return visitor.Visit(target); +internal sealed class GenericExpressionVisitor(Func genericProcessor) : ExpressionVisitor + where T : class +{ + public static Expression Process(Expression target, Func genericProcessor) => + new GenericExpressionVisitor(genericProcessor).Process(target); - using (new RemapScope()) - return visitor.Visit(target); - } + public Expression Process(Expression target) + { + if (RemapScope.CurrentContext!=null) + return Visit(target); - protected override Expression VisitUnknown(Expression e) - { - var mapped = e as T; - if (mapped!=null) - return VisitGenericExpression(mapped); - - var extendedExpression = e as ExtendedExpression; - if (extendedExpression != null && extendedExpression.ExtendedType == ExtendedExpressionType.Marker) { - var marker = (MarkerExpression) e; - var result = Visit(marker.Target); - if (result == marker.Target) - return result; - return new MarkerExpression(result, marker.MarkerType); - } - - return base.VisitUnknown(e); - } + using (new RemapScope()) + return Visit(target); + } - private Expression VisitGenericExpression(T generic) - { - if (genericProcessor!=null) - return genericProcessor.Invoke(generic); - throw new NotSupportedException(Strings.ExUnableToUseBaseImplementationOfVisitGenericExpressionWithoutSpecifyingGenericProcessorDelegate); + protected override Expression VisitUnknown(Expression e) + { + if (e is T mapped) + return VisitGenericExpression(mapped); + + if (e is ExtendedExpression extendedExpression && extendedExpression.ExtendedType == ExtendedExpressionType.Marker) { + var marker = (MarkerExpression) e; + var result = Visit(marker.Target); + if (result == marker.Target) + return result; + return new MarkerExpression(result, marker.MarkerType); } + return base.VisitUnknown(e); + } - // Constructors - - private GenericExpressionVisitor(Func mappingProcessor) - { - genericProcessor = mappingProcessor; - } + private Expression VisitGenericExpression(T generic) + { + if (genericProcessor!=null) + return genericProcessor.Invoke(generic); + throw new NotSupportedException(Strings.ExUnableToUseBaseImplementationOfVisitGenericExpressionWithoutSpecifyingGenericProcessorDelegate); } -} \ No newline at end of file +}