Skip to content

Commit a6e7a44

Browse files
maca88hazzik
authored andcommitted
Fix missing cast when comparing a Guid and String columns in Sql Server (#2042)
1 parent 22cd760 commit a6e7a44

File tree

4 files changed

+28
-0
lines changed

4 files changed

+28
-0
lines changed

src/NHibernate.Test/Async/NHSpecificTest/NH3426/Fixture.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,5 +84,18 @@ public async Task WhereGuidToStringAsync()
8484
Assert.That(list, Has.Count.EqualTo(1));
8585
}
8686
}
87+
88+
[Test]
89+
public async Task CompareStringColumnWithGuidToStringAsync()
90+
{
91+
using (var session = OpenSession())
92+
{
93+
var list = await (session.Query<Entity>()
94+
.Where(x => x.Id.ToString() == x.Name)
95+
.ToListAsync());
96+
97+
Assert.That(list, Has.Count.EqualTo(0));
98+
}
99+
}
87100
}
88101
}

src/NHibernate.Test/NHSpecificTest/NH3426/Fixture.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,5 +72,18 @@ public void WhereGuidToString()
7272
Assert.That(list, Has.Count.EqualTo(1));
7373
}
7474
}
75+
76+
[Test]
77+
public void CompareStringColumnWithGuidToString()
78+
{
79+
using (var session = OpenSession())
80+
{
81+
var list = session.Query<Entity>()
82+
.Where(x => x.Id.ToString() == x.Name)
83+
.ToList();
84+
85+
Assert.That(list, Has.Count.EqualTo(0));
86+
}
87+
}
7588
}
7689
}

src/NHibernate/Dialect/MsSql2000Dialect.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,7 @@ protected virtual void RegisterFunctions()
352352
// Casting to CHAR (without specified length) truncates to 30 characters.
353353
// A longer version would be safer, but 50 is enough to prevent errors when casting uniqueidentifer to a string representation (NH-2858)
354354
RegisterFunction("str", new SQLFunctionTemplate(NHibernateUtil.String, "cast(?1 as nvarchar(50))"));
355+
RegisterFunction("strguid", new SQLFunctionTemplate(NHibernateUtil.String, "cast(?1 as char(36))"));
355356

356357
RegisterFunction("substring", new EmulatedLengthSubstringFunction());
357358

src/NHibernate/Dialect/MsSqlCeDialect.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ protected virtual void RegisterFunctions()
170170
{
171171
RegisterFunction("substring", new EmulatedLengthSubstringFunction());
172172
RegisterFunction("str", new SQLFunctionTemplate(NHibernateUtil.String, "cast(?1 as nvarchar)"));
173+
RegisterFunction("strguid", new SQLFunctionTemplate(NHibernateUtil.String, "cast(?1 as nvarchar)"));
173174

174175
RegisterFunction("current_timestamp", new NoArgSQLFunction("getdate", NHibernateUtil.DateTime, true));
175176
RegisterFunction("date", new SQLFunctionTemplate(NHibernateUtil.DateTime, "dateadd(dd, 0, datediff(dd, 0, ?1))"));

0 commit comments

Comments
 (0)