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

Commit ec926e6

Browse files
committed
Change SqlServer Window RowNum expression to use aliases when provided
1 parent 2766bad commit ec926e6

File tree

2 files changed

+132
-1
lines changed

2 files changed

+132
-1
lines changed

src/ServiceStack.OrmLite.SqlServer/SqlServerOrmLiteDialectProvider.cs

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ public override string ToSelectStatement(ModelDefinition modelDef,
412412

413413
var ret = string.Format(
414414
"{0} FROM (SELECT ROW_NUMBER() OVER ({2}) As RowNum, {1} {3}) AS RowConstrainedResult WHERE RowNum > {4} AND RowNum <= {5}",
415-
selectExpression.StripTablePrefixes(), //SELECT without RowNum to be able to use in SELECT IN () Reference Queries
415+
UseAliasesOrStripTablePrefixes(selectExpression),
416416
selectExpression.Substring(selectType.Length),
417417
orderByExpression,
418418
bodyExpression,
@@ -421,5 +421,43 @@ public override string ToSelectStatement(ModelDefinition modelDef,
421421

422422
return ret;
423423
}
424+
425+
//SELECT without RowNum and prefer aliases to be able to use in SELECT IN () Reference Queries
426+
public static string UseAliasesOrStripTablePrefixes(string selectExpression)
427+
{
428+
if (selectExpression.IndexOf('.') < 0)
429+
return selectExpression;
430+
431+
var sb = new StringBuilder();
432+
var selectToken = selectExpression.SplitOnFirst(' ');
433+
var tokens = selectToken[1].Split(',');
434+
foreach (var token in tokens)
435+
{
436+
if (sb.Length > 0)
437+
sb.Append(", ");
438+
439+
var field = token.Trim();
440+
441+
var aliasParts = field.SplitOnLast(' ');
442+
if (aliasParts.Length > 1)
443+
{
444+
sb.Append(" " + aliasParts[aliasParts.Length - 1]);
445+
continue;
446+
}
447+
448+
var parts = field.SplitOnLast('.');
449+
if (parts.Length > 1)
450+
{
451+
sb.Append(" " + parts[parts.Length - 1]);
452+
}
453+
else
454+
{
455+
sb.Append(" " + field);
456+
}
457+
}
458+
459+
var sqlSelect = selectToken[0] + " " + sb.ToString().Trim();
460+
return sqlSelect;
461+
}
424462
}
425463
}

tests/ServiceStack.OrmLite.Tests/Expression/ComplexJoinTests.cs

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,49 @@ internal class JoinResult
8282
public string BazName { get; set; }
8383
}
8484

85+
public class Product : IHasGuidId
86+
{
87+
[PrimaryKey]
88+
public Guid Id { get; set; }
89+
90+
[Required]
91+
public string Name { get; set; }
92+
93+
public string Code { get; set; }
94+
95+
[Required]
96+
[Alias("fkManufacturerId")]
97+
[ForeignKey(typeof(Manufacturer), ForeignKeyName = "fk_Product_Manufacturer")]
98+
public Guid ManufacturerId { get; set; }
99+
}
100+
101+
public class Manufacturer : IHasGuidId
102+
{
103+
[PrimaryKey]
104+
public Guid Id { get; set; }
105+
106+
public string Name { get; set; }
107+
}
108+
109+
public class ProductWithManufacturer
110+
{
111+
[BelongTo(typeof(Product))]
112+
public Guid ProductId { get; set; }
113+
114+
[BelongTo(typeof(Product))]
115+
public string ProductName { get; set; }
116+
117+
[BelongTo(typeof(Product))]
118+
public string Code { get; set; }
119+
120+
[BelongTo(typeof(Product))]
121+
[Alias("fkManufacturerId")]
122+
public Guid ManufacturerId { get; set; }
123+
124+
[BelongTo(typeof(Manufacturer))]
125+
public string ManufacturerName { get; set; }
126+
}
127+
85128
[TestFixture]
86129
public class ComplexJoinTests : OrmLiteTestBase
87130
{
@@ -177,5 +220,55 @@ public void ComplexJoin_with_SqlExpression()
177220
Assert.That(fooBarBaz.BazId, Is.EqualTo(1));
178221
}
179222
}
223+
224+
[Test]
225+
public void Can_limit_ComplexJoin_query()
226+
{
227+
using (var db = OpenDbConnection())
228+
{
229+
db.DropTable<Product>();
230+
db.DropTable<Manufacturer>();
231+
232+
db.CreateTable<Manufacturer>();
233+
db.CreateTable<Product>();
234+
235+
var manufacturer = new Manufacturer
236+
{
237+
Id = Guid.NewGuid(),
238+
Name = "ManName",
239+
};
240+
db.Insert(manufacturer);
241+
db.Insert(new Product
242+
{
243+
Id = Guid.NewGuid(),
244+
Name = "SA1 ProductName",
245+
Code = "CODE A",
246+
ManufacturerId = manufacturer.Id,
247+
});
248+
db.Insert(new Product
249+
{
250+
Id = Guid.NewGuid(),
251+
Name = "SA2 ProductName",
252+
Code = "CODE B",
253+
ManufacturerId = manufacturer.Id,
254+
});
255+
256+
var q = db.From<Product>()
257+
.Join<Manufacturer>((p, m) => p.ManufacturerId == m.Id)
258+
.Where<Product>(p => p.Name.Contains("SA"))
259+
.OrderBy<Product>(p => p.Name)
260+
.Limit(1, 25);
261+
262+
var results = db.Select<ProductWithManufacturer>(q);
263+
264+
db.GetLastSql().Print();
265+
266+
Assert.That(results[0].ManufacturerName, Is.EqualTo(manufacturer.Name));
267+
Assert.That(results[0].ManufacturerId, Is.EqualTo(manufacturer.Id));
268+
Assert.That(results[0].Code, Is.EqualTo("CODE B"));
269+
270+
results.PrintDump();
271+
}
272+
}
180273
}
181274
}

0 commit comments

Comments
 (0)