Fix failing tests

This commit is contained in:
2023-10-10 22:17:32 +02:00
parent 19829ccd0a
commit aa7cf4f9c6
7 changed files with 24 additions and 26 deletions

View File

@@ -22,7 +22,6 @@ namespace BasicSample
private string _FullName => FirstName + " " + LastName;
[Projectable(UseMemberBody = nameof(_TotalSpent))]
[NotMapped]
public double TotalSpent { get; set; }
private double _TotalSpent => Orders.Sum(x => x.PriceSum);
@@ -92,7 +91,7 @@ namespace BasicSample
.AddDbContext<ApplicationDbContext>((provider, options) => {
options
.UseSqlite(dbConnection)
.LogTo(Console.WriteLine)
// .LogTo(Console.WriteLine)
.EnableSensitiveDataLogging()
.UseProjectables();
})

View File

@@ -18,6 +18,6 @@ namespace EntityFrameworkCore.Projectables.Extensions
/// Replaces all calls to properties and methods that are marked with the <C>Projectable</C> attribute with their respective expression tree
/// </summary>
public static Expression ExpandProjectables(this Expression expression)
=> new ProjectableExpressionReplacer(new ProjectionExpressionResolver()).Visit(expression);
=> new ProjectableExpressionReplacer(new ProjectionExpressionResolver()).Replace(expression);
}
}

View File

@@ -34,6 +34,6 @@ namespace EntityFrameworkCore.Projectables.Infrastructure.Internal
=> _decoratedQueryCompiler.ExecuteAsync<TResult>(Expand(query), cancellationToken);
Expression Expand(Expression expression)
=> _projectableExpressionReplacer.Visit(expression);
=> _projectableExpressionReplacer.Replace(expression);
}
}

View File

@@ -13,15 +13,13 @@ namespace EntityFrameworkCore.Projectables.Services
{
readonly IProjectionExpressionResolver _resolver;
readonly ExpressionArgumentReplacer _expressionArgumentReplacer = new();
readonly QueryRootReplacer _queryRootReplacer;
readonly Dictionary<MemberInfo, LambdaExpression?> _projectableMemberCache = new();
private bool _disableRootRewrite = false;
private bool _disableRootRewrite;
private IEntityType? _entityType;
public ProjectableExpressionReplacer(IProjectionExpressionResolver projectionExpressionResolver)
{
_resolver = projectionExpressionResolver;
_queryRootReplacer = new(_resolver);
}
bool TryGetReflectedExpression(MemberInfo memberInfo, [NotNullWhen(true)] out LambdaExpression? reflectedExpression)
@@ -41,19 +39,19 @@ namespace EntityFrameworkCore.Projectables.Services
}
[return: NotNullIfNotNull(nameof(node))]
public override Expression? Visit(Expression? node)
public Expression? Replace(Expression? node)
{
var ret = base.Visit(node);
var ret = Visit(node);
if (_disableRootRewrite)
{
return ret;
}
switch (node)
switch (ret)
{
// Probably a First() or ToList()
case MethodCallExpression { Arguments.Count: > 0 } call when _entityType != null:
case MethodCallExpression { Arguments.Count: > 0, Object: null } call when _entityType != null:
{
var self = _AddProjectableSelect(call.Arguments.First(), _entityType);
return call.Update(null, call.Arguments.Skip(1).Prepend(self));
@@ -96,7 +94,7 @@ namespace EntityFrameworkCore.Projectables.Services
var updatedBody = _expressionArgumentReplacer.Visit(reflectedExpression.Body);
_expressionArgumentReplacer.ParameterArgumentMapping.Clear();
return Visit(
return base.Visit(
updatedBody
);
}
@@ -128,13 +126,13 @@ namespace EntityFrameworkCore.Projectables.Services
var updatedBody = _expressionArgumentReplacer.Visit(reflectedExpression.Body);
_expressionArgumentReplacer.ParameterArgumentMapping.Clear();
return Visit(
return base.Visit(
updatedBody
);
}
else
{
return Visit(
return base.Visit(
reflectedExpression.Body
);
}
@@ -190,7 +188,7 @@ namespace EntityFrameworkCore.Projectables.Services
Expression.New(entityType.ClrType),
properties.Select(x => Expression.Bind(x, Expression.MakeMemberAccess(xParam, x)))
.Concat(projectableProperties
.Select(x => Expression.Bind(x, _ReplaceParam(_resolver.FindGeneratedExpression(x), xParam)))
.Select(x => Expression.Bind(x, _GetAccessor(x, xParam)))
)
),
xParam
@@ -198,12 +196,13 @@ namespace EntityFrameworkCore.Projectables.Services
);
}
private Expression _ReplaceParam(LambdaExpression lambda, ParameterExpression para)
private Expression _GetAccessor(PropertyInfo property, ParameterExpression para)
{
var lambda = _resolver.FindGeneratedExpression(property);
_expressionArgumentReplacer.ParameterArgumentMapping.Add(lambda.Parameters[0], para);
var updatedBody = _expressionArgumentReplacer.Visit(lambda.Body);
_expressionArgumentReplacer.ParameterArgumentMapping.Clear();
return updatedBody;
return base.Visit(updatedBody);
}
}
}

View File

@@ -61,7 +61,7 @@ namespace EntityFrameworkCore.Projectables.Tests.Services
);
var subject = new ProjectableExpressionReplacer(resolver);
var actual = subject.Visit(input);
var actual = subject.Replace(input);
Assert.Equal(expected.ToString(), actual.ToString());
}
@@ -77,7 +77,7 @@ namespace EntityFrameworkCore.Projectables.Tests.Services
);
var subject = new ProjectableExpressionReplacer(resolver);
var actual = subject.Visit(input);
var actual = subject.Replace(input);
Assert.Equal(expected.ToString(), actual.ToString());
}
@@ -93,7 +93,7 @@ namespace EntityFrameworkCore.Projectables.Tests.Services
);
var subject = new ProjectableExpressionReplacer(resolver);
var actual = subject.Visit(input);
var actual = subject.Replace(input);
Assert.Equal(expected.ToString(), actual.ToString());
}
@@ -109,7 +109,7 @@ namespace EntityFrameworkCore.Projectables.Tests.Services
);
var subject = new ProjectableExpressionReplacer(resolver);
var actual = subject.Visit(input);
var actual = subject.Replace(input);
Assert.Equal(expected.ToString(), actual.ToString());
}
@@ -125,7 +125,7 @@ namespace EntityFrameworkCore.Projectables.Tests.Services
);
var subject = new ProjectableExpressionReplacer(resolver);
var actual = subject.Visit(input);
var actual = subject.Replace(input);
Assert.Equal(expected.ToString(), actual.ToString());
}
@@ -141,7 +141,7 @@ namespace EntityFrameworkCore.Projectables.Tests.Services
);
var subject = new ProjectableExpressionReplacer(resolver);
var actual = subject.Visit(input);
var actual = subject.Replace(input);
Assert.Equal(expected.ToString(), actual.ToString());
}
@@ -157,7 +157,7 @@ namespace EntityFrameworkCore.Projectables.Tests.Services
);
var subject = new ProjectableExpressionReplacer(resolver);
var actual = subject.Visit(input);
var actual = subject.Replace(input);
Assert.Equal(expected.ToString(), actual.ToString());
}