Skip to content

Commit 661d2f3

Browse files
committed
Use ReplacingExpressionVisitor instead, add additional test for LeftJoin extension method
1 parent e1329d5 commit 661d2f3

File tree

3 files changed

+43
-23
lines changed

3 files changed

+43
-23
lines changed

src/NHibernate.Test/Async/Linq/ByMethod/JoinTests.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,27 @@ public async Task MultipleLinqJoinsWithSameProjectionNamesWithLeftJoinExtensionM
9393
}
9494
}
9595

96+
[Test]
97+
public async Task LeftJoinExtensionMethodWithMultipleKeyPropertiesAsync()
98+
{
99+
using (var sqlSpy = new SqlLogSpy())
100+
{
101+
var orders = await (db.Orders
102+
.LeftJoin(
103+
db.Orders,
104+
x => new {x.OrderId, x.Customer.CustomerId},
105+
x => new {x.OrderId, x.Customer.CustomerId},
106+
(order, order1) => new {order, order1})
107+
.Select(x => new {FirstId = x.order.OrderId, SecondId = x.order1.OrderId})
108+
.ToListAsync());
109+
110+
var sql = sqlSpy.GetWholeLog();
111+
Assert.That(orders.Count, Is.EqualTo(830));
112+
Assert.IsTrue(orders.All(x => x.FirstId == x.SecondId));
113+
Assert.That(GetTotalOccurrences(sql, "left outer join"), Is.EqualTo(1));
114+
}
115+
}
116+
96117
[TestCase(false)]
97118
[TestCase(true)]
98119
public async Task CrossJoinWithPredicateInWhereStatementAsync(bool useCrossJoin)

src/NHibernate.Test/Linq/ByMethod/JoinTests.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,27 @@ public void MultipleLinqJoinsWithSameProjectionNamesWithLeftJoinExtensionMethod(
8282
}
8383
}
8484

85+
[Test]
86+
public void LeftJoinExtensionMethodWithMultipleKeyProperties()
87+
{
88+
using (var sqlSpy = new SqlLogSpy())
89+
{
90+
var orders = db.Orders
91+
.LeftJoin(
92+
db.Orders,
93+
x => new {x.OrderId, x.Customer.CustomerId},
94+
x => new {x.OrderId, x.Customer.CustomerId},
95+
(order, order1) => new {order, order1})
96+
.Select(x => new {FirstId = x.order.OrderId, SecondId = x.order1.OrderId})
97+
.ToList();
98+
99+
var sql = sqlSpy.GetWholeLog();
100+
Assert.That(orders.Count, Is.EqualTo(830));
101+
Assert.IsTrue(orders.All(x => x.FirstId == x.SecondId));
102+
Assert.That(GetTotalOccurrences(sql, "left outer join"), Is.EqualTo(1));
103+
}
104+
}
105+
85106
[TestCase(false)]
86107
[TestCase(true)]
87108
public void CrossJoinWithPredicateInWhereStatement(bool useCrossJoin)

src/NHibernate/Linq/LinqExtensionMethods.cs

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2517,7 +2517,7 @@ public static IQueryable<TResult> LeftJoin<TOuter, TInner, TKey, TResult>(
25172517
var paramNew = Expression.Parameter(typeof(LeftJoinIntermediate<TOuter, TInner>));
25182518
var outerProperty = Expression.Property(paramNew, nameof(LeftJoinIntermediate<TOuter, TInner>.OneOuter));
25192519
var selectManyResultSelector = Expression.Lambda(
2520-
new Replacer(outerParameter, outerProperty).Visit(resultSelector.Body),
2520+
ReplacingExpressionVisitor.Replace(outerParameter, outerProperty, resultSelector.Body),
25212521
paramNew,
25222522
resultSelector.Parameters[1]);
25232523

@@ -2531,28 +2531,6 @@ private class LeftJoinIntermediate<TOuter, TInner>
25312531
public IEnumerable<TInner> ManyInners { get; set; }
25322532
}
25332533

2534-
private class Replacer : ExpressionVisitor
2535-
{
2536-
private readonly ParameterExpression _oldParam;
2537-
private readonly Expression _replacement;
2538-
2539-
public Replacer(ParameterExpression oldParam, Expression replacement)
2540-
{
2541-
_oldParam = oldParam;
2542-
_replacement = replacement;
2543-
}
2544-
2545-
public override Expression Visit(Expression exp)
2546-
{
2547-
if (exp == _oldParam)
2548-
{
2549-
return _replacement;
2550-
}
2551-
2552-
return base.Visit(exp);
2553-
}
2554-
}
2555-
25562534
#endregion
25572535

25582536
/// <summary>

0 commit comments

Comments
 (0)