Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit c2275dd

Browse files
committed
Add fix for merging Nested SqlExpression Issue
1 parent bfbbb22 commit c2275dd

File tree

3 files changed

+55
-1
lines changed

3 files changed

+55
-1
lines changed

src/ServiceStack.OrmLite/Expressions/SqlExpression.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1739,14 +1739,15 @@ protected string ConvertInExpressionToSql(MethodCallExpression m, object quotedC
17391739
if (exprArg != null)
17401740
{
17411741
var subSelect = exprArg.ToSelectStatement();
1742+
var renameParams = new List<Tuple<string,string>>();
17421743
foreach (var p in exprArg.Params)
17431744
{
17441745
var oldName = p.ParameterName;
17451746
var newName = DialectProvider.GetParam(Params.Count.ToString());
17461747
if (oldName != newName)
17471748
{
17481749
var pClone = DialectProvider.CreateParam().PopulateWith(p);
1749-
subSelect = subSelect.Replace(oldName, newName);
1750+
renameParams.Add(Tuple.Create(oldName, newName));
17501751
pClone.ParameterName = newName;
17511752
Params.Add(pClone);
17521753
}
@@ -1755,6 +1756,12 @@ protected string ConvertInExpressionToSql(MethodCallExpression m, object quotedC
17551756
Params.Add(p);
17561757
}
17571758
}
1759+
1760+
for (var i = renameParams.Count - 1; i >= 0; i--)
1761+
{
1762+
subSelect = subSelect.Replace(renameParams[i].Item1, renameParams[i].Item2);
1763+
}
1764+
17581765
return string.Format("{0} {1} ({2})", quotedColName, "IN", subSelect);
17591766
}
17601767

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
using System;
2+
using NUnit.Framework;
3+
using ServiceStack.OrmLite.Sqlite;
4+
5+
namespace ServiceStack.OrmLite.Tests.Issues
6+
{
7+
public class Organization
8+
{
9+
public Guid Id { get; set; }
10+
public bool IsActive { get; set; }
11+
public string Name { get; set; }
12+
}
13+
14+
public class OrganizationMembership
15+
{
16+
public Guid Id { get; set; }
17+
public Guid OrganizationId { get; set; }
18+
public bool HasA { get; set; }
19+
public bool HasB { get; set; }
20+
public bool HasC { get; set; }
21+
}
22+
23+
public class MergingNestedSqlExpressionIssue : OrmLiteTestBase
24+
{
25+
[Test]
26+
public void Does_merge_subselect_params_correctly()
27+
{
28+
OrmLiteConfig.DialectProvider = new SqliteOrmLiteDialectProvider();
29+
30+
// select a group of ids
31+
var ids = OrmLiteConfig.DialectProvider.SqlExpression<OrganizationMembership>();
32+
ids.Where(x => x.HasA == true && x.HasB == true && x.HasC == true);
33+
ids.SelectDistinct(x => x.OrganizationId);
34+
35+
// select organizations
36+
var expression = OrmLiteConfig.DialectProvider.SqlExpression<Organization>();
37+
// that are active
38+
expression.Where(x => x.IsActive == true);
39+
// and belong to the same group
40+
expression.Where(x => Sql.In(x.Id, ids));
41+
42+
Assert.That(expression.WhereExpression, Is.EqualTo(
43+
"WHERE (\"IsActive\" = @0) AND \"Id\" IN (SELECT DISTINCT \"OrganizationId\" \nFROM \"OrganizationMembership\"\nWHERE (((\"HasA\" = @1) AND (\"HasB\" = @2)) AND (\"HasC\" = @3)))"));
44+
}
45+
}
46+
}

tests/ServiceStack.OrmLite.Tests/ServiceStack.OrmLite.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@
130130
<Compile Include="DateTimeTests.cs" />
131131
<Compile Include="DefaultValueTests.cs" />
132132
<Compile Include="Issues\BelongsToIssue.cs" />
133+
<Compile Include="Issues\MergingNestedSqlExpressionIssue.cs" />
133134
<Compile Include="UseCase\ExpressionsAuthorTests.cs" />
134135
<Compile Include="Expression\ComplexJoinTests.cs" />
135136
<Compile Include="Expression\ExpressionUsingCustomSerializedEnumTests.cs" />

0 commit comments

Comments
 (0)