mirror of
https://github.com/zoriya/EntityFrameworkCore.Projectables.git
synced 2025-12-06 05:56:10 +00:00
Fix failing tests
This commit is contained in:
@@ -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();
|
||||
})
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user