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

Commit 99bbd31

Browse files
committed
Add ISqlExpression on JoinSqlBuilder and SqlBuilder
1 parent 7912fdd commit 99bbd31

File tree

4 files changed

+60
-4
lines changed

4 files changed

+60
-4
lines changed

src/ServiceStack.OrmLite/Expressions/ReadConnectionExtensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,9 +111,9 @@ public static List<T> Select<T>(this IDbConnection dbConn, SqlExpression<T> expr
111111
/// Returns results from using an SqlExpression lambda. E.g:
112112
/// <para>db.Select(db.From&lt;Person&gt;().Where(x =&gt; x.Age &gt; 40))</para>
113113
/// </summary>
114-
public static List<T> Select<T>(this IDbConnection dbConn, ISqlExpression expression)
114+
public static List<T> Select<T>(this IDbConnection dbConn, ISqlExpression expression, object anonType = null)
115115
{
116-
return dbConn.Exec(dbCmd => dbCmd.SqlList<T>(expression.ToSelectStatement()));
116+
return dbConn.Exec(dbCmd => dbCmd.SqlList<T>(expression.ToSelectStatement(), anonType));
117117
}
118118

119119
/// <summary>

src/ServiceStack.OrmLite/JoinSqlBuilder.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
namespace ServiceStack.OrmLite
88
{
9-
public class JoinSqlBuilder<TNewPoco, TBasePoco>
9+
public class JoinSqlBuilder<TNewPoco, TBasePoco> : ISqlExpression
1010
{
1111
private List<Join> joinList = new List<Join>();
1212
private List<KeyValuePair<string, WhereType>> whereList = new List<KeyValuePair<string, WhereType>>();
@@ -418,6 +418,11 @@ private void CheckAggregateUsage(bool ignoreCurrentItem)
418418
}
419419
}
420420

421+
public string ToSelectStatement()
422+
{
423+
return ToSql();
424+
}
425+
421426
public string ToSql()
422427
{
423428
CheckAggregateUsage(false);

src/ServiceStack.OrmLite/SqlBuilder.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ public string ResolveClauses(DynamicParameters p)
172172
}
173173
}
174174

175-
public class Template
175+
public class Template : ISqlExpression
176176
{
177177
readonly string sql;
178178
readonly SqlBuilder builder;
@@ -214,6 +214,11 @@ void ResolveSql()
214214

215215
public string RawSql { get { ResolveSql(); return rawSql; } }
216216
public object Parameters { get { ResolveSql(); return parameters; } }
217+
218+
public string ToSelectStatement()
219+
{
220+
return RawSql;
221+
}
217222
}
218223

219224
public Template AddTemplate(string sql, object parameters = null)

tests/ServiceStack.OrmLite.Tests/JoinSqlBuilderTests.cs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System.Text.RegularExpressions;
22
using NUnit.Framework;
33
using ServiceStack.DataAnnotations;
4+
using ServiceStack.Text;
45

56
namespace ServiceStack.OrmLite.Tests
67
{
@@ -86,5 +87,50 @@ public void DoubleWhereLeftJoinTest ()
8687
var stmt = OrmLiteConfig.DialectProvider.ToSelectStatement(typeof(User), joinQuery);
8788
Assert.That(Regex.Matches(stmt, @"(\b|\n)FROM(\b|\n)", RegexOptions.IgnoreCase).Count, Is.EqualTo(1));
8889
}
90+
91+
[Test]
92+
public void Can_execute_JoinSqlBuilder_as_SqlExpression()
93+
{
94+
var joinQuery = new JoinSqlBuilder<User, User>()
95+
.LeftJoin<User, WithAliasAddress>(x => x.Id, x => x.UserId
96+
, sourceWhere: x => x.Age > 18
97+
, destinationWhere: x => x.Country == "Italy");
98+
99+
using (var db = OpenDbConnection())
100+
{
101+
db.DropAndCreateTable<User>();
102+
db.DropAndCreateTable<WithAliasAddress>();
103+
104+
var userId = db.Insert(new User { Age = 27, Name = "Foo" }, selectIdentity:true);
105+
db.Insert(new WithAliasAddress { City = "Rome", Country = "Italy", UserId = (int)userId });
106+
107+
var results = db.Select<User>(joinQuery);
108+
Assert.That(results.Count, Is.EqualTo(1));
109+
}
110+
}
111+
112+
[Test]
113+
public void Can_execute_SqlBuilder_templates_as_SqlExpression()
114+
{
115+
var sb = new SqlBuilder();
116+
117+
var tmpl = sb.AddTemplate("SELECT * FROM User u INNER JOIN Addresses a on a.UserId = u.Id /**where**/");
118+
sb.Where("Age > @age", new { age = 18 });
119+
sb.Where("Countryalias = @country", new { country = "Italy" });
120+
121+
122+
using (var db = OpenDbConnection())
123+
{
124+
db.DropAndCreateTable<User>();
125+
db.DropAndCreateTable<WithAliasAddress>();
126+
127+
var userId = db.Insert(new User { Age = 27, Name = "Foo" }, selectIdentity: true);
128+
db.Insert(new WithAliasAddress { City = "Rome", Country = "Italy", UserId = (int)userId });
129+
130+
var results = db.Select<User>(tmpl, tmpl.Parameters);
131+
132+
Assert.That(results.Count, Is.EqualTo(1));
133+
}
134+
}
89135
}
90136
}

0 commit comments

Comments
 (0)