Skip to content

Commit 7a77430

Browse files
authored
Fix Queryable.Contains method for Linq provider (#2674)
Fixes #2544
1 parent 5ea209d commit 7a77430

File tree

6 files changed

+137
-6
lines changed

6 files changed

+137
-6
lines changed

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,18 @@ public async Task CanExecuteAnyWithArgumentsAsync()
3535
Assert.IsFalse(result);
3636
}
3737

38+
[Test]
39+
public async Task CanExecuteContainsAsync()
40+
{
41+
var user = await (db.Users.FirstOrDefaultAsync());
42+
var result = db.Users.Contains(user);
43+
Assert.That(result, Is.True);
44+
45+
user = new User("test", DateTime.Now);
46+
result = db.Users.Contains(user);
47+
Assert.That(result, Is.False);
48+
}
49+
3850
[Test]
3951
public async Task CanExecuteCountWithOrderByArgumentsAsync()
4052
{
@@ -163,4 +175,4 @@ public async Task CanSelectPropertiesIntoNestedObjectArraysAsync()
163175
Assert.That(nestedNestedObjectArray[1], Is.EqualTo("ayende"));
164176
}
165177
}
166-
}
178+
}

src/NHibernate.Test/Async/NHSpecificTest/NH3850/MainFixture.cs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,17 @@ public async Task AnyBBaseWithNameAsync()
187187
}
188188
}
189189

190+
[Test]
191+
public async Task ContainsBBaseAsync()
192+
{
193+
using (var session = OpenSession())
194+
{
195+
var item = await (session.Query<DomainClassBExtendedByA>().FirstAsync(dc => dc.Name == SearchName1));
196+
var result = session.Query<DomainClassBExtendedByA>().Contains(item);
197+
Assert.That(result, Is.True);
198+
}
199+
}
200+
190201
// Non-reg case
191202
[Test]
192203
public async Task AnyCBaseAsync()
@@ -213,6 +224,17 @@ public async Task AnyCBaseWithNameAsync()
213224
}
214225
}
215226

227+
[Test]
228+
public async Task ContainsCBaseAsync()
229+
{
230+
using (var session = OpenSession())
231+
{
232+
var item = await (session.Query<DomainClassCExtendedByD>().FirstAsync(dc => dc.Name == SearchName1));
233+
var result = session.Query<DomainClassCExtendedByD>().Contains(item);
234+
Assert.That(result, Is.True);
235+
}
236+
}
237+
216238
// Non-reg case
217239
[Test]
218240
public async Task AnyEAsync()
@@ -239,6 +261,17 @@ public async Task AnyEWithNameAsync()
239261
}
240262
}
241263

264+
[Test]
265+
public async Task ContainsEAsync()
266+
{
267+
using (var session = OpenSession())
268+
{
269+
var item = await (session.Query<DomainClassE>().FirstAsync(dc => dc.Name == SearchName1));
270+
var result = session.Query<DomainClassE>().Contains(item);
271+
Assert.That(result, Is.True);
272+
}
273+
}
274+
242275
// Non-reg case
243276
[Test]
244277
public async Task AnyFAsync()
@@ -291,6 +324,17 @@ public async Task AnyGBaseWithNameAsync()
291324
}
292325
}
293326

327+
[Test]
328+
public async Task ContainsGBaseAsync()
329+
{
330+
using (var session = OpenSession())
331+
{
332+
var item = await (session.Query<DomainClassGExtendedByH>().FirstAsync(dc => dc.Name == SearchName1));
333+
var result = session.Query<DomainClassGExtendedByH>().Contains(item);
334+
Assert.That(result, Is.True);
335+
}
336+
}
337+
294338
// Failing case till NH-3850 is fixed
295339
[Test]
296340
public async Task AnyObjectAsync()

src/NHibernate.Test/Linq/MethodCallTests.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,18 @@ public void CanExecuteAnyWithArguments()
2323
Assert.IsFalse(result);
2424
}
2525

26+
[Test]
27+
public void CanExecuteContains()
28+
{
29+
var user = db.Users.FirstOrDefault();
30+
var result = db.Users.Contains(user);
31+
Assert.That(result, Is.True);
32+
33+
user = new User("test", DateTime.Now);
34+
result = db.Users.Contains(user);
35+
Assert.That(result, Is.False);
36+
}
37+
2638
[Test]
2739
public void CanExecuteCountWithOrderByArguments()
2840
{
@@ -151,4 +163,4 @@ public void CanSelectPropertiesIntoNestedObjectArrays()
151163
Assert.That(nestedNestedObjectArray[1], Is.EqualTo("ayende"));
152164
}
153165
}
154-
}
166+
}

src/NHibernate.Test/NHSpecificTest/NH3850/MainFixture.cs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,17 @@ public void AnyBBaseWithName()
194194
}
195195
}
196196

197+
[Test]
198+
public void ContainsBBase()
199+
{
200+
using (var session = OpenSession())
201+
{
202+
var item = session.Query<DomainClassBExtendedByA>().First(dc => dc.Name == SearchName1);
203+
var result = session.Query<DomainClassBExtendedByA>().Contains(item);
204+
Assert.That(result, Is.True);
205+
}
206+
}
207+
197208
// Non-reg case
198209
[Test]
199210
public void AnyCBase()
@@ -220,6 +231,17 @@ public void AnyCBaseWithName()
220231
}
221232
}
222233

234+
[Test]
235+
public void ContainsCBase()
236+
{
237+
using (var session = OpenSession())
238+
{
239+
var item = session.Query<DomainClassCExtendedByD>().First(dc => dc.Name == SearchName1);
240+
var result = session.Query<DomainClassCExtendedByD>().Contains(item);
241+
Assert.That(result, Is.True);
242+
}
243+
}
244+
223245
// Non-reg case
224246
[Test]
225247
public void AnyE()
@@ -246,6 +268,17 @@ public void AnyEWithName()
246268
}
247269
}
248270

271+
[Test]
272+
public void ContainsE()
273+
{
274+
using (var session = OpenSession())
275+
{
276+
var item = session.Query<DomainClassE>().First(dc => dc.Name == SearchName1);
277+
var result = session.Query<DomainClassE>().Contains(item);
278+
Assert.That(result, Is.True);
279+
}
280+
}
281+
249282
// Non-reg case
250283
[Test]
251284
public void AnyF()
@@ -272,6 +305,17 @@ public void AnyFWithName()
272305
}
273306
}
274307

308+
[Test]
309+
public void ContainsF()
310+
{
311+
using (var session = OpenSession())
312+
{
313+
var item = new DomainClassF() {Id = -1};
314+
var result = session.Query<DomainClassF>().Contains(item);
315+
Assert.That(result, Is.False);
316+
}
317+
}
318+
275319
// Non-reg case
276320
[Test]
277321
public void AnyGBase()
@@ -298,6 +342,17 @@ public void AnyGBaseWithName()
298342
}
299343
}
300344

345+
[Test]
346+
public void ContainsGBase()
347+
{
348+
using (var session = OpenSession())
349+
{
350+
var item = session.Query<DomainClassGExtendedByH>().First(dc => dc.Name == SearchName1);
351+
var result = session.Query<DomainClassGExtendedByH>().Contains(item);
352+
Assert.That(result, Is.True);
353+
}
354+
}
355+
301356
// Failing case till NH-3850 is fixed
302357
[Test]
303358
public void AnyObject()

src/NHibernate/Linq/Visitors/ResultOperatorProcessors/ProcessAny.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@ namespace NHibernate.Linq.Visitors.ResultOperatorProcessors
1010
public class ProcessAny : IResultOperatorProcessor<AnyResultOperator>
1111
{
1212
public void Process(AnyResultOperator anyOperator, QueryModelVisitor queryModelVisitor, IntermediateHqlTree tree)
13+
{
14+
Process(tree);
15+
}
16+
17+
internal static void Process(IntermediateHqlTree tree)
1318
{
1419
if (tree.IsRoot)
1520
{
@@ -24,8 +29,8 @@ public void Process(AnyResultOperator anyOperator, QueryModelVisitor queryModelV
2429
}
2530
else
2631
{
27-
tree.SetRoot(tree.TreeBuilder.Exists((HqlQuery)tree.Root));
32+
tree.SetRoot(tree.TreeBuilder.Exists((HqlQuery) tree.Root));
2833
}
2934
}
3035
}
31-
}
36+
}

src/NHibernate/Linq/Visitors/ResultOperatorProcessors/ProcessContains.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
1-
using System.Collections;
1+
using System;
2+
using System.Collections;
3+
using System.Collections.Generic;
24
using System.Linq;
5+
using System.Linq.Expressions;
36
using NHibernate.Hql.Ast;
47
using Remotion.Linq.Clauses.ResultOperators;
58

@@ -37,7 +40,7 @@ public void Process(ContainsResultOperator resultOperator, QueryModelVisitor que
3740
tree.AddWhereClause(tree.TreeBuilder.Equality(
3841
tree.TreeBuilder.Ident(GetFromAlias(tree.Root).AstNode.Text),
3942
itemExpression));
40-
tree.SetRoot(tree.TreeBuilder.Exists((HqlQuery)tree.Root));
43+
ProcessAny.Process(tree);
4144
}
4245
else
4346
{

0 commit comments

Comments
 (0)