Skip to content

Commit aa7cf4f

Browse files
committed
Fix failing tests
1 parent 19829cc commit aa7cf4f

7 files changed

Lines changed: 24 additions & 26 deletions

File tree

Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,4 @@
3030
</PropertyGroup>
3131

3232

33-
</Project>
33+
</Project>

samples/BasicSample/Program.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ public class User
2222
private string _FullName => FirstName + " " + LastName;
2323

2424
[Projectable(UseMemberBody = nameof(_TotalSpent))]
25-
[NotMapped]
2625
public double TotalSpent { get; set; }
2726
private double _TotalSpent => Orders.Sum(x => x.PriceSum);
2827

@@ -92,7 +91,7 @@ public static void Main(string[] args)
9291
.AddDbContext<ApplicationDbContext>((provider, options) => {
9392
options
9493
.UseSqlite(dbConnection)
95-
.LogTo(Console.WriteLine)
94+
// .LogTo(Console.WriteLine)
9695
.EnableSensitiveDataLogging()
9796
.UseProjectables();
9897
})

src/EntityFrameworkCore.Projectables/Extensions/ExpressionExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,6 @@ public static Expression ExpandQuaryables(this Expression expression)
1818
/// Replaces all calls to properties and methods that are marked with the <C>Projectable</C> attribute with their respective expression tree
1919
/// </summary>
2020
public static Expression ExpandProjectables(this Expression expression)
21-
=> new ProjectableExpressionReplacer(new ProjectionExpressionResolver()).Visit(expression);
21+
=> new ProjectableExpressionReplacer(new ProjectionExpressionResolver()).Replace(expression);
2222
}
2323
}

src/EntityFrameworkCore.Projectables/Infrastructure/Internal/CustomQueryCompiler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,6 @@ public TResult ExecuteAsync<TResult>(Expression query, CancellationToken cancell
3434
=> _decoratedQueryCompiler.ExecuteAsync<TResult>(Expand(query), cancellationToken);
3535

3636
Expression Expand(Expression expression)
37-
=> _projectableExpressionReplacer.Visit(expression);
37+
=> _projectableExpressionReplacer.Replace(expression);
3838
}
3939
}

src/EntityFrameworkCore.Projectables/Services/ProjectableExpressionReplacer.cs

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,13 @@ public sealed class ProjectableExpressionReplacer : ExpressionVisitor
1313
{
1414
readonly IProjectionExpressionResolver _resolver;
1515
readonly ExpressionArgumentReplacer _expressionArgumentReplacer = new();
16-
readonly QueryRootReplacer _queryRootReplacer;
1716
readonly Dictionary<MemberInfo, LambdaExpression?> _projectableMemberCache = new();
18-
private bool _disableRootRewrite = false;
17+
private bool _disableRootRewrite;
1918
private IEntityType? _entityType;
2019

2120
public ProjectableExpressionReplacer(IProjectionExpressionResolver projectionExpressionResolver)
2221
{
2322
_resolver = projectionExpressionResolver;
24-
_queryRootReplacer = new(_resolver);
2523
}
2624

2725
bool TryGetReflectedExpression(MemberInfo memberInfo, [NotNullWhen(true)] out LambdaExpression? reflectedExpression)
@@ -41,19 +39,19 @@ bool TryGetReflectedExpression(MemberInfo memberInfo, [NotNullWhen(true)] out La
4139
}
4240

4341
[return: NotNullIfNotNull(nameof(node))]
44-
public override Expression? Visit(Expression? node)
42+
public Expression? Replace(Expression? node)
4543
{
46-
var ret = base.Visit(node);
44+
var ret = Visit(node);
4745

4846
if (_disableRootRewrite)
4947
{
5048
return ret;
5149
}
5250

53-
switch (node)
51+
switch (ret)
5452
{
5553
// Probably a First() or ToList()
56-
case MethodCallExpression { Arguments.Count: > 0 } call when _entityType != null:
54+
case MethodCallExpression { Arguments.Count: > 0, Object: null } call when _entityType != null:
5755
{
5856
var self = _AddProjectableSelect(call.Arguments.First(), _entityType);
5957
return call.Update(null, call.Arguments.Skip(1).Prepend(self));
@@ -96,7 +94,7 @@ protected override Expression VisitMethodCall(MethodCallExpression node)
9694
var updatedBody = _expressionArgumentReplacer.Visit(reflectedExpression.Body);
9795
_expressionArgumentReplacer.ParameterArgumentMapping.Clear();
9896

99-
return Visit(
97+
return base.Visit(
10098
updatedBody
10199
);
102100
}
@@ -128,13 +126,13 @@ PropertyInfo property when nodeExpression is not null
128126
var updatedBody = _expressionArgumentReplacer.Visit(reflectedExpression.Body);
129127
_expressionArgumentReplacer.ParameterArgumentMapping.Clear();
130128

131-
return Visit(
129+
return base.Visit(
132130
updatedBody
133131
);
134132
}
135133
else
136134
{
137-
return Visit(
135+
return base.Visit(
138136
reflectedExpression.Body
139137
);
140138
}
@@ -190,20 +188,21 @@ private Expression _AddProjectableSelect(Expression node, IEntityType entityType
190188
Expression.New(entityType.ClrType),
191189
properties.Select(x => Expression.Bind(x, Expression.MakeMemberAccess(xParam, x)))
192190
.Concat(projectableProperties
193-
.Select(x => Expression.Bind(x, _ReplaceParam(_resolver.FindGeneratedExpression(x), xParam)))
191+
.Select(x => Expression.Bind(x, _GetAccessor(x, xParam)))
194192
)
195193
),
196194
xParam
197195
)
198196
);
199197
}
200198

201-
private Expression _ReplaceParam(LambdaExpression lambda, ParameterExpression para)
199+
private Expression _GetAccessor(PropertyInfo property, ParameterExpression para)
202200
{
201+
var lambda = _resolver.FindGeneratedExpression(property);
203202
_expressionArgumentReplacer.ParameterArgumentMapping.Add(lambda.Parameters[0], para);
204203
var updatedBody = _expressionArgumentReplacer.Visit(lambda.Body);
205204
_expressionArgumentReplacer.ParameterArgumentMapping.Clear();
206-
return updatedBody;
205+
return base.Visit(updatedBody);
207206
}
208207
}
209208
}
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
SELECT [e].[Id], [e].[Id] * 5
2-
FROM [Entity] AS [e]
2+
FROM [Entity] AS [e]

tests/EntityFrameworkCore.Projectables.Tests/Services/ProjectableExpressionReplacerTests.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public void VisitMember_SimpleProperty()
6161
);
6262
var subject = new ProjectableExpressionReplacer(resolver);
6363

64-
var actual = subject.Visit(input);
64+
var actual = subject.Replace(input);
6565

6666
Assert.Equal(expected.ToString(), actual.ToString());
6767
}
@@ -77,7 +77,7 @@ public void VisitMember_SimpleMethod()
7777
);
7878
var subject = new ProjectableExpressionReplacer(resolver);
7979

80-
var actual = subject.Visit(input);
80+
var actual = subject.Replace(input);
8181

8282
Assert.Equal(expected.ToString(), actual.ToString());
8383
}
@@ -93,7 +93,7 @@ public void VisitMember_SimpleMethodWithArguments()
9393
);
9494
var subject = new ProjectableExpressionReplacer(resolver);
9595

96-
var actual = subject.Visit(input);
96+
var actual = subject.Replace(input);
9797

9898
Assert.Equal(expected.ToString(), actual.ToString());
9999
}
@@ -109,7 +109,7 @@ public void VisitMember_SimpleStatefullProperty()
109109
);
110110
var subject = new ProjectableExpressionReplacer(resolver);
111111

112-
var actual = subject.Visit(input);
112+
var actual = subject.Replace(input);
113113

114114
Assert.Equal(expected.ToString(), actual.ToString());
115115
}
@@ -125,7 +125,7 @@ public void VisitMember_SimpleStatefullMethod()
125125
);
126126
var subject = new ProjectableExpressionReplacer(resolver);
127127

128-
var actual = subject.Visit(input);
128+
var actual = subject.Replace(input);
129129

130130
Assert.Equal(expected.ToString(), actual.ToString());
131131
}
@@ -141,7 +141,7 @@ public void VisitMember_SimpleStaticMethod()
141141
);
142142
var subject = new ProjectableExpressionReplacer(resolver);
143143

144-
var actual = subject.Visit(input);
144+
var actual = subject.Replace(input);
145145

146146
Assert.Equal(expected.ToString(), actual.ToString());
147147
}
@@ -157,7 +157,7 @@ public void VisitMember_SimpleStaticMethodWithArguments()
157157
);
158158
var subject = new ProjectableExpressionReplacer(resolver);
159159

160-
var actual = subject.Visit(input);
160+
var actual = subject.Replace(input);
161161

162162
Assert.Equal(expected.ToString(), actual.ToString());
163163
}

0 commit comments

Comments
 (0)