Skip to content

Commit 9da30bf

Browse files
committed
Changed the logic to generate one parameter for each variable
1 parent 4325448 commit 9da30bf

File tree

9 files changed

+528
-73
lines changed

9 files changed

+528
-73
lines changed

src/NHibernate.Test/Async/Linq/ParameterTests.cs

Lines changed: 115 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,12 @@
88
//------------------------------------------------------------------------------
99

1010

11+
using System;
1112
using System.Collections.Generic;
1213
using System.Linq;
14+
using System.Linq.Expressions;
1315
using System.Text.RegularExpressions;
16+
using NHibernate.DomainModel.Northwind.Entities;
1417
using NUnit.Framework;
1518
using NHibernate.Linq;
1619

@@ -22,7 +25,7 @@ namespace NHibernate.Test.Linq
2225
public class ParameterTestsAsync : LinqTestCase
2326
{
2427
[Test]
25-
public async Task UsingSameArrayParameterTwiceAsync()
28+
public async Task UsingArrayParameterTwiceAsync()
2629
{
2730
var ids = new[] {11008, 11019, 11039};
2831
await (AssertTotalParametersAsync(
@@ -31,36 +34,36 @@ public async Task UsingSameArrayParameterTwiceAsync()
3134
}
3235

3336
[Test]
34-
public async Task UsingDifferentArrayParametersAsync()
37+
public async Task UsingTwoArrayParametersAsync()
3538
{
36-
var ids = new[] { 11008, 11019, 11039 };
37-
var ids2 = new[] { 11008, 11019, 11039 };
39+
var ids = new[] {11008, 11019, 11039};
40+
var ids2 = new[] {11008, 11019, 11039};
3841
await (AssertTotalParametersAsync(
3942
db.Orders.Where(o => ids.Contains(o.OrderId) && ids2.Contains(o.OrderId)),
4043
ids.Length + ids2.Length));
4144
}
4245

4346
[Test]
44-
public async Task UsingSameListParameterTwiceAsync()
47+
public async Task UsingListParameterTwiceAsync()
4548
{
46-
var ids = new List<int> { 11008, 11019, 11039 };
49+
var ids = new List<int> {11008, 11019, 11039};
4750
await (AssertTotalParametersAsync(
4851
db.Orders.Where(o => ids.Contains(o.OrderId) && ids.Contains(o.OrderId)),
4952
ids.Count));
5053
}
5154

5255
[Test]
53-
public async Task UsingDifferentListParametersAsync()
56+
public async Task UsingTwoListParametersAsync()
5457
{
55-
var ids = new List<int> { 11008, 11019, 11039 };
56-
var ids2 = new List<int> { 11008, 11019, 11039 };
58+
var ids = new List<int> {11008, 11019, 11039};
59+
var ids2 = new List<int> {11008, 11019, 11039};
5760
await (AssertTotalParametersAsync(
5861
db.Orders.Where(o => ids.Contains(o.OrderId) && ids2.Contains(o.OrderId)),
5962
ids.Count + ids2.Count));
6063
}
6164

6265
[Test]
63-
public async Task UsingSameEntityParameterTwiceAsync()
66+
public async Task UsingEntityParameterTwiceAsync()
6467
{
6568
var order = await (db.Orders.FirstAsync());
6669
await (AssertTotalParametersAsync(
@@ -69,17 +72,17 @@ public async Task UsingSameEntityParameterTwiceAsync()
6972
}
7073

7174
[Test]
72-
public async Task UsingDifferentEntityParametersAsync()
75+
public async Task UsingTwoEntityParametersAsync()
7376
{
7477
var order = await (db.Orders.FirstAsync());
75-
var order2 = await (db.Orders.Skip(1).FirstAsync());
78+
var order2 = await (db.Orders.FirstAsync());
7679
await (AssertTotalParametersAsync(
7780
db.Orders.Where(o => o == order && o != order2),
7881
2));
7982
}
8083

8184
[Test]
82-
public async Task UsingSameValueTypeParameterTwiceAsync()
85+
public async Task UsingValueTypeParameterTwiceAsync()
8386
{
8487
var value = 1;
8588
await (AssertTotalParametersAsync(
@@ -88,17 +91,35 @@ public async Task UsingSameValueTypeParameterTwiceAsync()
8891
}
8992

9093
[Test]
91-
public async Task UsingDifferentValueTypeParametersAsync()
94+
public async Task UsingNegateValueTypeParameterTwiceAsync()
95+
{
96+
var value = 1;
97+
await (AssertTotalParametersAsync(
98+
db.Orders.Where(o => o.OrderId == -value && o.OrderId != -value),
99+
1));
100+
}
101+
102+
[Test]
103+
public async Task UsingNegateValueTypeParameterAsync()
92104
{
93105
var value = 1;
94-
var value2 = 2;
106+
await (AssertTotalParametersAsync(
107+
db.Orders.Where(o => o.OrderId == value && o.OrderId != -value),
108+
2));
109+
}
110+
111+
[Test]
112+
public async Task UsingTwoValueTypeParametersAsync()
113+
{
114+
var value = 1;
115+
var value2 = 1;
95116
await (AssertTotalParametersAsync(
96117
db.Orders.Where(o => o.OrderId == value && o.OrderId != value2),
97118
2));
98119
}
99120

100121
[Test]
101-
public async Task UsingSameStringParameterTwiceAsync()
122+
public async Task UsingStringParameterTwiceAsync()
102123
{
103124
var value = "test";
104125
await (AssertTotalParametersAsync(
@@ -107,15 +128,91 @@ public async Task UsingSameStringParameterTwiceAsync()
107128
}
108129

109130
[Test]
110-
public async Task UsingDifferentStringParametersAsync()
131+
public async Task UsingTwoStringParametersAsync()
111132
{
112133
var value = "test";
113-
var value2 = "test2";
134+
var value2 = "test";
114135
await (AssertTotalParametersAsync(
115136
db.Products.Where(o => o.Name == value && o.Name != value2),
116137
2));
117138
}
118139

140+
[Test]
141+
public async Task UsingObjectPropertyParameterTwiceAsync()
142+
{
143+
var value = new Product {Name = "test"};
144+
await (AssertTotalParametersAsync(
145+
db.Products.Where(o => o.Name == value.Name && o.Name != value.Name),
146+
1));
147+
}
148+
149+
[Test]
150+
public async Task UsingTwoObjectPropertyParametersAsync()
151+
{
152+
var value = new Product {Name = "test"};
153+
var value2 = new Product {Name = "test"};
154+
await (AssertTotalParametersAsync(
155+
db.Products.Where(o => o.Name == value.Name && o.Name != value2.Name),
156+
2));
157+
}
158+
159+
[Test]
160+
public async Task UsingObjectNestedPropertyParameterTwiceAsync()
161+
{
162+
var value = new Employee {Superior = new Employee {Superior = new Employee {FirstName = "test"}}};
163+
await (AssertTotalParametersAsync(
164+
db.Employees.Where(o => o.FirstName == value.Superior.Superior.FirstName && o.FirstName != value.Superior.Superior.FirstName),
165+
1));
166+
}
167+
168+
[Test]
169+
public async Task UsingDifferentObjectNestedPropertyParameterAsync()
170+
{
171+
var value = new Employee {Superior = new Employee {FirstName = "test", Superior = new Employee {FirstName = "test"}}};
172+
await (AssertTotalParametersAsync(
173+
db.Employees.Where(o => o.FirstName == value.Superior.FirstName && o.FirstName != value.Superior.Superior.FirstName),
174+
2));
175+
}
176+
177+
[Test]
178+
public async Task UsingMethodObjectPropertyParameterTwiceAsync()
179+
{
180+
var value = new Product {Name = "test"};
181+
await (AssertTotalParametersAsync(
182+
db.Products.Where(o => o.Name == value.Name.Trim() && o.Name != value.Name.Trim()),
183+
2));
184+
}
185+
186+
[Test]
187+
public async Task UsingStaticMethodObjectPropertyParameterTwiceAsync()
188+
{
189+
var value = new Product {Name = "test"};
190+
await (AssertTotalParametersAsync(
191+
db.Products.Where(o => o.Name == string.Copy(value.Name) && o.Name != string.Copy(value.Name)),
192+
2));
193+
}
194+
195+
[Test]
196+
public async Task UsingObjectPropertyParameterWithSecondLevelClosureAsync()
197+
{
198+
var value = new Product {Name = "test"};
199+
Expression<Func<Product, bool>> predicate = o => o.Name == value.Name && o.Name != value.Name;
200+
await (AssertTotalParametersAsync(
201+
db.Products.Where(predicate),
202+
1));
203+
}
204+
205+
[Test]
206+
public async Task UsingObjectPropertyParameterWithThirdLevelClosureAsync()
207+
{
208+
var value = new Product {Name = "test"};
209+
Expression<Func<OrderLine, bool>> orderLinePredicate = o => o.Order.ShippedTo == value.Name && o.Order.ShippedTo != value.Name;
210+
Expression<Func<Product, bool>> predicate = o => o.Name == value.Name && o.OrderLines.AsQueryable().Any(orderLinePredicate);
211+
await (AssertTotalParametersAsync(
212+
db.Products.Where(predicate),
213+
1));
214+
}
215+
119216
private static async Task AssertTotalParametersAsync<T>(IQueryable<T> query, int parameterNumber, CancellationToken cancellationToken = default(CancellationToken))
120217
{
121218
using (var sqlSpy = new SqlLogSpy())

src/NHibernate.Test/Linq/ConstantTest.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -215,10 +215,13 @@ public void ConstantInWhereDoesNotCauseManyKeys()
215215
var q2 = (from c in db.Customers
216216
where c.CustomerId == "ANATR"
217217
select c);
218-
var parameters1 = ExpressionParameterVisitor.Visit(q1.Expression, Sfi);
219-
var k1 = ExpressionKeyVisitor.Visit(q1.Expression, parameters1);
220-
var parameters2 = ExpressionParameterVisitor.Visit(q2.Expression, Sfi);
221-
var k2 = ExpressionKeyVisitor.Visit(q2.Expression, parameters2);
218+
var evalResult = NhRelinqQueryParser.PartialEvaluate(q1.Expression);
219+
var expression = ExpressionParameterVisitor.Visit(evalResult, Sfi, out var parameters1);
220+
var k1 = ExpressionKeyVisitor.Visit(expression, parameters1);
221+
222+
var evalResult2 = NhRelinqQueryParser.PartialEvaluate(q1.Expression);
223+
var expression2 = ExpressionParameterVisitor.Visit(evalResult2, Sfi, out var parameters2);
224+
var k2 = ExpressionKeyVisitor.Visit(expression2, parameters2);
222225

223226
Assert.That(parameters1, Has.Count.GreaterThan(0), "parameters1");
224227
Assert.That(parameters2, Has.Count.GreaterThan(0), "parameters2");

0 commit comments

Comments
 (0)