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

Commit fd22f29

Browse files
committed
Add support for Count's on Joins
1 parent 1b617fc commit fd22f29

File tree

5 files changed

+15
-39
lines changed

5 files changed

+15
-39
lines changed

src/ServiceStack.OrmLite/Expressions/SqlExpression.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -518,7 +518,7 @@ public virtual string ToSelectStatement()
518518

519519
public virtual string ToCountStatement()
520520
{
521-
return DialectProvider.ToCountStatement(modelDef.ModelType, WhereExpression, null);
521+
return "SELECT COUNT(*)" + BodyExpression;
522522
}
523523

524524
public string SelectExpression

src/ServiceStack.OrmLite/IOrmLiteDialectProvider.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,6 @@ string ToSelectFromProcedureStatement(object fromObjWithProperties,
103103
string sqlFilter,
104104
params object[] filterParams);
105105

106-
string ToCountStatement(Type fromTableType, string sqlFilter, params object[] filterParams);
107-
108106
string ToExecuteProcedureStatement(object objWithProperties);
109107

110108
string ToCreateTableStatement(Type tableType);

src/ServiceStack.OrmLite/OrmLiteDialectProviderBase.cs

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -415,35 +415,6 @@ public virtual long InsertAndGetLastInsertId<T>(IDbCommand dbCmd)
415415
return dbCmd.ExecLongScalar();
416416
}
417417

418-
public virtual string ToCountStatement(Type fromTableType, string sqlFilter, params object[] filterParams)
419-
{
420-
var sql = new StringBuilder();
421-
const string SelectStatement = "SELECT ";
422-
var modelDef = fromTableType.GetModelDefinition();
423-
var isFullSelectStatement =
424-
!string.IsNullOrEmpty(sqlFilter)
425-
&& sqlFilter.TrimStart().StartsWith(SelectStatement, StringComparison.OrdinalIgnoreCase);
426-
427-
if (isFullSelectStatement)
428-
return (filterParams != null ? sqlFilter.SqlFmt(filterParams) : sqlFilter);
429-
430-
sql.AppendFormat("SELECT {0} FROM {1}", "COUNT(*)",
431-
GetQuotedTableName(modelDef));
432-
433-
if (!string.IsNullOrEmpty(sqlFilter))
434-
{
435-
sqlFilter = filterParams != null ? sqlFilter.SqlFmt(filterParams) : sqlFilter;
436-
if ((!sqlFilter.StartsWith("ORDER ", StringComparison.OrdinalIgnoreCase)
437-
&& !sqlFilter.StartsWith("LIMIT ", StringComparison.OrdinalIgnoreCase))
438-
&& (!sqlFilter.StartsWith("WHERE ", StringComparison.OrdinalIgnoreCase)))
439-
{
440-
sql.Append(" WHERE ");
441-
}
442-
sql.Append(" " + sqlFilter);
443-
}
444-
return sql.ToString();
445-
}
446-
447418
// Fmt
448419
public virtual string ToSelectStatement(Type tableType, string sqlFilter, params object[] filterParams)
449420
{

tests/ServiceStack.OrmLite.Tests/ApiSqlServerTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,10 @@ public void API_SqlServer_Examples()
5757
Assert.That(db.GetLastSql(), Is.EqualTo("SELECT Max(\"Age\") \nFROM \"Person\"\nWHERE (\"Age\" < 50)"));
5858

5959
db.Count<Person>(x => x.Age < 50);
60-
Assert.That(db.GetLastSql(), Is.EqualTo("SELECT COUNT(*) FROM \"Person\" WHERE (\"Age\" < 50)"));
60+
Assert.That(db.GetLastSql(), Is.EqualTo("SELECT COUNT(*) \nFROM \"Person\"\nWHERE (\"Age\" < 50)"));
6161

6262
db.Count(db.From<Person>().Where(x => x.Age < 50));
63-
Assert.That(db.GetLastSql(), Is.EqualTo("SELECT COUNT(*) FROM \"Person\" WHERE (\"Age\" < 50)"));
63+
Assert.That(db.GetLastSql(), Is.EqualTo("SELECT COUNT(*) \nFROM \"Person\"\nWHERE (\"Age\" < 50)"));
6464

6565

6666
db.Select<Person>("Age > 40");
@@ -186,10 +186,10 @@ public void API_SqlServer_Examples()
186186
Assert.That(db.GetLastSql(), Is.EqualTo("SELECT Id, LastName FROM Person WHERE Age < 50"));
187187

188188
db.Exists<Person>(x => x.Age < 50);
189-
Assert.That(db.GetLastSql(), Is.EqualTo("SELECT COUNT(*) FROM \"Person\" WHERE (\"Age\" < 50)"));
189+
Assert.That(db.GetLastSql(), Is.EqualTo("SELECT COUNT(*) \nFROM \"Person\"\nWHERE (\"Age\" < 50)"));
190190

191191
db.Exists(db.From<Person>().Where(x => x.Age < 50));
192-
Assert.That(db.GetLastSql(), Is.EqualTo("SELECT COUNT(*) FROM \"Person\" WHERE (\"Age\" < 50)"));
192+
Assert.That(db.GetLastSql(), Is.EqualTo("SELECT COUNT(*) \nFROM \"Person\"\nWHERE (\"Age\" < 50)"));
193193

194194
db.Exists<Person>(new { Age = 42 });
195195
Assert.That(db.GetLastSql(), Is.EqualTo("SELECT \"Id\", \"FirstName\", \"LastName\", \"Age\" FROM \"Person\" WHERE \"Age\" = @Age"));

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

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -221,17 +221,24 @@ public void Can_do_ToCountStatement_with_SqlExpression_if_where_expression_refer
221221
db.DropAndCreateTable<LetterStat>();
222222

223223
var letterFrequency = new LetterFrequency { Letter = "A" };
224-
letterFrequency.Id = (int)db.Insert<LetterFrequency>(letterFrequency, true);
224+
letterFrequency.Id = (int)db.Insert(letterFrequency, true);
225225

226-
db.Insert<LetterStat>(new LetterStat { Letter = "A", LetterFrequencyId = letterFrequency.Id, Weighting = 1 });
226+
db.Insert(new LetterStat { Letter = "A", LetterFrequencyId = letterFrequency.Id, Weighting = 1 });
227227

228228
var expr = db.From<LetterFrequency>()
229229
.Join<LetterFrequency, LetterStat>()
230230
.Where<LetterStat>(x => x.Id > 0);
231231

232-
var count = db.SqlScalar<int>(expr.ToCountStatement());
232+
var count = db.SqlScalar<long>(expr.ToCountStatement());
233233

234234
Assert.That(count, Is.GreaterThan(0));
235+
236+
count = db.Count<LetterFrequency>(q => q.Join<LetterStat>().Where<LetterStat>(x => x.Id > 0));
237+
238+
Assert.That(count, Is.GreaterThan(0));
239+
240+
Assert.That(
241+
db.Exists<LetterFrequency>(q => q.Join<LetterStat>().Where<LetterStat>(x => x.Id > 0)));
235242
}
236243
}
237244
}

0 commit comments

Comments
 (0)