Skip to content

Commit b8fbadd

Browse files
Merge tag 5.3.2
2 parents c3ac6a0 + ed36de0 commit b8fbadd

File tree

16 files changed

+455
-18
lines changed

16 files changed

+455
-18
lines changed

releasenotes.txt

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,23 @@
1-
Build 5.3.1
1+
Build 5.3.2
2+
=============================
3+
4+
Release notes - NHibernate - Version 5.3.2
5+
6+
6 issues were resolved in this release.
7+
8+
** Bug
9+
10+
* #2468 Null reference at NHibernate.Util.AsyncReaderWriterLock.ReadLock()
11+
* #2465 Linq contains on a value collection is failing
12+
* #2463 Path expected for join
13+
* #2458 Evaluatable expressions with parameters are no more pre-evaluated
14+
* #2453 Fail to cast enum as nvarchar for Linq Contains
15+
16+
** Task
17+
18+
* #2472 Release 5.3.2
19+
20+
Build 5.3.1
221
=============================
322

423
Release notes - NHibernate - Version 5.3.1

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,14 @@ public async Task CanQueryOnEnumStoredAsString_Small_1Async()
6262
Assert.AreEqual(expectedCount, query.Count);
6363
}
6464

65+
[Test]
66+
public async Task CanQueryWithContainsOnEnumStoredAsString_Small_1Async()
67+
{
68+
var values = new[] { EnumStoredAsString.Small, EnumStoredAsString.Medium };
69+
var query = await (db.Users.Where(x => values.Contains(x.Enum1)).ToListAsync());
70+
Assert.AreEqual(3, query.Count);
71+
}
72+
6573
[Test]
6674
public async Task ConditionalNavigationPropertyAsync()
6775
{

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,37 @@ public async Task UsingValueTypeParameterTwiceAsync()
125125
1));
126126
}
127127

128+
[Test]
129+
public async Task UsingParameterInEvaluatableExpressionAsync()
130+
{
131+
var value = "test";
132+
await (db.Orders.Where(o => string.Format("{0}", value) != o.ShippedTo).ToListAsync());
133+
await (db.Orders.Where(o => $"{value}_" != o.ShippedTo).ToListAsync());
134+
await (db.Orders.Where(o => string.Copy(value) != o.ShippedTo).ToListAsync());
135+
136+
var guid = Guid.Parse("2D7E6EB3-BD08-4A40-A4E7-5150F7895821");
137+
await (db.Orders.Where(o => o.ShippedTo.Contains($"VALUE {guid}")).ToListAsync());
138+
139+
var names = new[] {"name"};
140+
await (db.Users.Where(x => names.Length == 0 || names.Contains(x.Name)).ToListAsync());
141+
names = new string[] { };
142+
await (db.Users.Where(x => names.Length == 0 || names.Contains(x.Name)).ToListAsync());
143+
}
144+
145+
[Test]
146+
public async Task UsingParameterOnSelectorsAsync()
147+
{
148+
var user = new User() {Id = 1};
149+
await (db.Users.Where(o => o == user).ToListAsync());
150+
await (db.Users.FirstOrDefaultAsync(o => o == user));
151+
await (db.Timesheets.Where(o => o.Users.Any(u => u == user)).ToListAsync());
152+
153+
var users = new[] {new User() {Id = 1}};
154+
await (db.Users.Where(o => users.Contains(o)).ToListAsync());
155+
await (db.Users.FirstOrDefaultAsync(o => users.Contains(o)));
156+
await (db.Timesheets.Where(o => o.Users.Any(u => users.Contains(u))).ToListAsync());
157+
}
158+
128159
[Test]
129160
public async Task UsingNegateValueTypeParameterTwiceAsync()
130161
{
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
//------------------------------------------------------------------------------
2+
// <auto-generated>
3+
// This code was generated by AsyncGenerator.
4+
//
5+
// Changes to this file may cause incorrect behavior and will be lost if
6+
// the code is regenerated.
7+
// </auto-generated>
8+
//------------------------------------------------------------------------------
9+
10+
11+
using System.Linq;
12+
using NHibernate.DomainModel;
13+
using NUnit.Framework;
14+
using NHibernate.Linq;
15+
16+
namespace NHibernate.Test.NHSpecificTest.GH2463
17+
{
18+
using System.Threading.Tasks;
19+
[TestFixture]
20+
public class FixtureAsync : TestCase
21+
{
22+
protected override string[] Mappings
23+
{
24+
get { return new[] {"ABC.hbm.xml"}; }
25+
}
26+
27+
[Test]
28+
public async Task CanJoinOnEntityWithDiscriminatorAsync()
29+
{
30+
using (var s = OpenSession())
31+
{
32+
await (s.Query<A>().Join(
33+
s.Query<A>(),
34+
a => a.Id,
35+
b => b.Id,
36+
(a, b) =>
37+
new {a, b}).ToListAsync());
38+
}
39+
}
40+
}
41+
}
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
//------------------------------------------------------------------------------
2+
// <auto-generated>
3+
// This code was generated by AsyncGenerator.
4+
//
5+
// Changes to this file may cause incorrect behavior and will be lost if
6+
// the code is regenerated.
7+
// </auto-generated>
8+
//------------------------------------------------------------------------------
9+
10+
11+
using System.Linq;
12+
using NUnit.Framework;
13+
using NHibernate.Linq;
14+
15+
namespace NHibernate.Test.NHSpecificTest.GH2465
16+
{
17+
using System.Threading.Tasks;
18+
[TestFixture]
19+
public class FixtureAsync : BugTestCase
20+
{
21+
protected override bool AppliesTo(Dialect.Dialect dialect)
22+
{
23+
return dialect.SupportsScalarSubSelects;
24+
}
25+
26+
protected override void OnSetUp()
27+
{
28+
using (var session = OpenSession())
29+
using (var transaction = session.BeginTransaction())
30+
{
31+
var applicant = new Entity {IdentityNames = {"name1", "name2"}};
32+
session.Save(applicant);
33+
34+
transaction.Commit();
35+
}
36+
}
37+
38+
protected override void OnTearDown()
39+
{
40+
using (var session = OpenSession())
41+
using (var transaction = session.BeginTransaction())
42+
{
43+
session.Delete("from System.Object");
44+
transaction.Commit();
45+
}
46+
}
47+
48+
[Test]
49+
public async Task ContainsInsideValueCollectionAsync()
50+
{
51+
using (var session = OpenSession())
52+
using (var transaction = session.BeginTransaction())
53+
{
54+
var identityNames = new[] {"name1", "x"};
55+
await (session
56+
.Query<Entity>()
57+
.Where(a => a.IdentityNames.Any(n => identityNames.Contains(n)))
58+
.ToListAsync());
59+
await (session
60+
.Query<Entity>()
61+
.Where(a => a.IdentityNames.All(n => identityNames.Contains(n)))
62+
.ToListAsync());
63+
await (session
64+
.Query<Entity>()
65+
.Where(a => a.IdentityNames.FirstOrDefault(n => identityNames.Contains(n)) == "test")
66+
.ToListAsync());
67+
68+
await (transaction.CommitAsync());
69+
}
70+
}
71+
72+
[Test]
73+
public async Task EqualsInsideValueCollectionAsync()
74+
{
75+
using (var session = OpenSession())
76+
using (var transaction = session.BeginTransaction())
77+
{
78+
var value = "test";
79+
await (session
80+
.Query<Entity>()
81+
.Where(a => a.IdentityNames.Any(n => n == value))
82+
.ToListAsync());
83+
await (session
84+
.Query<Entity>()
85+
.Where(a => a.IdentityNames.Any(n => (string) n == value))
86+
.ToListAsync());
87+
await (session
88+
.Query<Entity>()
89+
.Where(a => a.IdentityNames.All(n => n == value))
90+
.ToListAsync());
91+
await (session
92+
.Query<Entity>()
93+
.Where(a => a.IdentityNames.FirstOrDefault(n => n == "test") == "test")
94+
.ToListAsync());
95+
96+
await (transaction.CommitAsync());
97+
}
98+
}
99+
}
100+
}

src/NHibernate.Test/Linq/EnumTests.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,14 @@ public void CanQueryOnEnumStoredAsString(EnumStoredAsString type, int expectedCo
4949
Assert.AreEqual(expectedCount, query.Count);
5050
}
5151

52+
[Test]
53+
public void CanQueryWithContainsOnEnumStoredAsString_Small_1()
54+
{
55+
var values = new[] { EnumStoredAsString.Small, EnumStoredAsString.Medium };
56+
var query = db.Users.Where(x => values.Contains(x.Enum1)).ToList();
57+
Assert.AreEqual(3, query.Count);
58+
}
59+
5260
[Test]
5361
public void ConditionalNavigationProperty()
5462
{

src/NHibernate.Test/Linq/ParameterTests.cs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,37 @@ public void UsingValueTypeParameterTwice()
113113
1);
114114
}
115115

116+
[Test]
117+
public void UsingParameterInEvaluatableExpression()
118+
{
119+
var value = "test";
120+
db.Orders.Where(o => string.Format("{0}", value) != o.ShippedTo).ToList();
121+
db.Orders.Where(o => $"{value}_" != o.ShippedTo).ToList();
122+
db.Orders.Where(o => string.Copy(value) != o.ShippedTo).ToList();
123+
124+
var guid = Guid.Parse("2D7E6EB3-BD08-4A40-A4E7-5150F7895821");
125+
db.Orders.Where(o => o.ShippedTo.Contains($"VALUE {guid}")).ToList();
126+
127+
var names = new[] {"name"};
128+
db.Users.Where(x => names.Length == 0 || names.Contains(x.Name)).ToList();
129+
names = new string[] { };
130+
db.Users.Where(x => names.Length == 0 || names.Contains(x.Name)).ToList();
131+
}
132+
133+
[Test]
134+
public void UsingParameterOnSelectors()
135+
{
136+
var user = new User() {Id = 1};
137+
db.Users.Where(o => o == user).ToList();
138+
db.Users.FirstOrDefault(o => o == user);
139+
db.Timesheets.Where(o => o.Users.Any(u => u == user)).ToList();
140+
141+
var users = new[] {new User() {Id = 1}};
142+
db.Users.Where(o => users.Contains(o)).ToList();
143+
db.Users.FirstOrDefault(o => users.Contains(o));
144+
db.Timesheets.Where(o => o.Users.Any(u => users.Contains(u))).ToList();
145+
}
146+
116147
[Test]
117148
public void ValidateMixingTwoParametersCacheKeys()
118149
{

src/NHibernate.Test/Linq/ParameterTypeLocatorTests.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,22 @@ public void EqualStringEnumTest()
8484
);
8585
}
8686

87+
[Test]
88+
public void ContainsStringEnumTest()
89+
{
90+
var values = new[] {EnumStoredAsString.Small};
91+
AssertResults(
92+
new Dictionary<string, Predicate<IType>>
93+
{
94+
{"value(NHibernate.DomainModel.Northwind.Entities.EnumStoredAsString[])", o => o is EnumStoredAsStringType}
95+
},
96+
db.Users.Where(o => values.Contains(o.Enum1)),
97+
db.Users.Where(o => values.Contains(o.NullableEnum1.Value)),
98+
db.Users.Where(o => values.Contains(o.Name == o.Name ? o.Enum1 : o.NullableEnum1.Value)),
99+
db.Timesheets.Where(o => o.Users.Any(u => values.Contains(u.Enum1)))
100+
);
101+
}
102+
87103
[Test]
88104
public void EqualStringEnumTestWithFetch()
89105
{
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using System.Linq;
2+
using NHibernate.DomainModel;
3+
using NUnit.Framework;
4+
5+
namespace NHibernate.Test.NHSpecificTest.GH2463
6+
{
7+
[TestFixture]
8+
public class Fixture : TestCase
9+
{
10+
protected override string[] Mappings
11+
{
12+
get { return new[] {"ABC.hbm.xml"}; }
13+
}
14+
15+
[Test]
16+
public void CanJoinOnEntityWithDiscriminator()
17+
{
18+
using (var s = OpenSession())
19+
{
20+
s.Query<A>().Join(
21+
s.Query<A>(),
22+
a => a.Id,
23+
b => b.Id,
24+
(a, b) =>
25+
new {a, b}).ToList();
26+
}
27+
}
28+
}
29+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using System;
2+
using System.Collections.Generic;
3+
4+
namespace NHibernate.Test.NHSpecificTest.GH2465
5+
{
6+
public class Entity
7+
{
8+
private readonly IList<string> _identityNames = new List<string>();
9+
10+
public virtual Guid Id { get; set; }
11+
12+
public virtual IList<string> IdentityNames => _identityNames;
13+
}
14+
}

0 commit comments

Comments
 (0)