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

Commit 813fe40

Browse files
committed
Add SelectDistinct() fields overload
1 parent 45896ce commit 813fe40

File tree

2 files changed

+52
-6
lines changed

2 files changed

+52
-6
lines changed

src/ServiceStack.OrmLite/Expressions/SqlExpression.cs

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ public virtual SqlExpression<T> Select()
111111
/// set the specified selectExpression.
112112
/// </summary>
113113
/// <param name='selectExpression'>
114-
/// raw Select expression: "Select SomeField1, SomeField2 from SomeTable"
114+
/// raw Select expression: "SomeField1, SomeField2 from SomeTable"
115115
/// </param>
116116
public virtual SqlExpression<T> Select(string selectExpression)
117117
{
@@ -120,15 +120,30 @@ public virtual SqlExpression<T> Select(string selectExpression)
120120
return UnsafeSelect(selectExpression);
121121
}
122122

123-
public virtual SqlExpression<T> UnsafeSelect(string rawSelect)
123+
/// <summary>
124+
/// set the specified DISTINCT selectExpression.
125+
/// </summary>
126+
/// <param name='selectExpression'>
127+
/// raw Select expression: "SomeField1, SomeField2 from SomeTable"
128+
/// </param>
129+
public virtual SqlExpression<T> SelectDistinct(string selectExpression)
130+
{
131+
selectExpression?.SqlVerifyFragment();
132+
133+
return UnsafeSelect(selectExpression, distinct:true);
134+
}
135+
136+
public virtual SqlExpression<T> UnsafeSelect(string rawSelect) => UnsafeSelect(rawSelect, distinct: false);
137+
138+
public virtual SqlExpression<T> UnsafeSelect(string rawSelect, bool distinct)
124139
{
125140
if (string.IsNullOrEmpty(rawSelect))
126141
{
127-
BuildSelectExpression(string.Empty, false);
142+
BuildSelectExpression(string.Empty, distinct: distinct);
128143
}
129144
else
130145
{
131-
this.selectExpression = "SELECT " + rawSelect;
146+
this.selectExpression = "SELECT " + (distinct ? "DISTINCT " : "") + rawSelect;
132147
this.CustomSelect = true;
133148
OnlyFields = null;
134149
}
@@ -141,7 +156,17 @@ public virtual SqlExpression<T> UnsafeSelect(string rawSelect)
141156
/// <param name='fields'>
142157
/// Matching Fields: "SomeField1, SomeField2"
143158
/// </param>
144-
public virtual SqlExpression<T> Select(string[] fields)
159+
public virtual SqlExpression<T> Select(string[] fields) => Select(fields, distinct: false);
160+
161+
/// <summary>
162+
/// Set the specified DISTINCT selectExpression using matching fields.
163+
/// </summary>
164+
/// <param name='fields'>
165+
/// Matching Fields: "SomeField1, SomeField2"
166+
/// </param>
167+
public virtual SqlExpression<T> SelectDistinct(string[] fields) => Select(fields, distinct: true);
168+
169+
internal virtual SqlExpression<T> Select(string[] fields, bool distinct)
145170
{
146171
if (fields == null || fields.Length == 0)
147172
return Select(string.Empty);
@@ -192,7 +217,7 @@ public virtual SqlExpression<T> Select(string[] fields)
192217
sb.Append(qualifiedName);
193218
}
194219

195-
UnsafeSelect(StringBuilderCache.ReturnAndFree(sb));
220+
UnsafeSelect(StringBuilderCache.ReturnAndFree(sb), distinct:distinct);
196221
OnlyFields = new HashSet<string>(fieldsList, StringComparer.OrdinalIgnoreCase);
197222

198223
return this;

tests/ServiceStack.OrmLite.Tests/AutoQueryTests.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,6 +463,27 @@ public void Can_group_by_multiple_columns()
463463
}
464464
}
465465

466+
[Test]
467+
public void Can_query_Rockstars_with_Distinct_Fields()
468+
{
469+
using (var db = OpenDbConnection())
470+
{
471+
db.DropAndCreateTable<Rockstar>();
472+
db.InsertAll(SeedRockstars);
473+
//Add another Michael Rockstar
474+
db.Insert(new Rockstar { Id = 8, FirstName = "Michael", LastName = "Bolton", Age = 64, LivingStatus = LivingStatus.Alive, DateOfBirth = new DateTime(1953,02,26) });
475+
476+
var q = db.From<Rockstar>();
477+
q.SelectDistinct(new[]{ "FirstName" });
478+
479+
var results = db.LoadSelect(q, include:q.OnlyFields);
480+
481+
results.PrintDump();
482+
Assert.That(results.All(x => x.Id == 0));
483+
Assert.That(results.Count(x => x.FirstName == "Michael"), Is.EqualTo(1));
484+
}
485+
}
486+
466487
}
467488

468489
}

0 commit comments

Comments
 (0)