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

Commit 1a8e895

Browse files
committed
Change JoinFormat to use a typed delegate
1 parent 0d8f429 commit 1a8e895

File tree

5 files changed

+44
-14
lines changed

5 files changed

+44
-14
lines changed

src/ServiceStack.OrmLite.SqlServer/SqlServerTableHint.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22
{
33
public class SqlServerTableHint
44
{
5-
public const string ReadUncommitted = "{0} WITH (READUNCOMMITTED) {1}";
6-
public const string ReadCommitted = "{0} WITH (READCOMMITTED) {1}";
7-
public const string ReadPast = "{0} WITH (READPAST) {1}";
8-
public const string Serializable = "{0} WITH (SERIALIZABLE) {1}";
9-
public const string RepeatableRead = "{0} WITH (REPEATABLEREAD) {1}";
5+
public static JoinFormatDelegate ReadUncommitted = (table,expr) => "{0} WITH (READUNCOMMITTED) {1}".Fmt(table, expr);
6+
public static JoinFormatDelegate ReadCommitted = (table, expr) => "{0} WITH (READCOMMITTED) {1}".Fmt(table, expr);
7+
public static JoinFormatDelegate ReadPast = (table, expr) => "{0} WITH (READPAST) {1}".Fmt(table, expr);
8+
public static JoinFormatDelegate Serializable = (table, expr) => "{0} WITH (SERIALIZABLE) {1}".Fmt(table, expr);
9+
public static JoinFormatDelegate RepeatableRead = (table, expr) => "{0} WITH (REPEATABLEREAD) {1}".Fmt(table, expr);
1010
}
1111
}

src/ServiceStack.OrmLite/Expressions/SqlExpression.Join.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public SqlExpression<T> Join<Target>(Expression<Func<T, Target, bool>> joinExpr
2121
return InternalJoin("INNER JOIN", joinExpr);
2222
}
2323

24-
public SqlExpression<T> Join<Target>(Expression<Func<T, Target, bool>> joinExpr, string joinFormat)
24+
public SqlExpression<T> Join<Target>(Expression<Func<T, Target, bool>> joinExpr, JoinFormatDelegate joinFormat)
2525
{
2626
if (joinFormat == null)
2727
throw new ArgumentNullException("joinFormat");
@@ -34,7 +34,7 @@ public SqlExpression<T> Join<Source, Target>(Expression<Func<Source, Target, boo
3434
return InternalJoin("INNER JOIN", joinExpr);
3535
}
3636

37-
public SqlExpression<T> Join<Source, Target>(Expression<Func<Source, Target, bool>> joinExpr, string joinFormat)
37+
public SqlExpression<T> Join<Source, Target>(Expression<Func<Source, Target, bool>> joinExpr, JoinFormatDelegate joinFormat)
3838
{
3939
return InternalJoin("INNER JOIN", joinExpr, joinFormat);
4040
}
@@ -49,7 +49,7 @@ public SqlExpression<T> LeftJoin<Target>(Expression<Func<T, Target, bool>> joinE
4949
return InternalJoin("LEFT JOIN", joinExpr);
5050
}
5151

52-
public SqlExpression<T> LeftJoin<Target>(Expression<Func<T, Target, bool>> joinExpr, string joinFormat)
52+
public SqlExpression<T> LeftJoin<Target>(Expression<Func<T, Target, bool>> joinExpr, JoinFormatDelegate joinFormat)
5353
{
5454
if (joinFormat == null)
5555
throw new ArgumentNullException("joinFormat");
@@ -62,7 +62,7 @@ public SqlExpression<T> LeftJoin<Source, Target>(Expression<Func<Source, Target,
6262
return InternalJoin("LEFT JOIN", joinExpr);
6363
}
6464

65-
public SqlExpression<T> LeftJoin<Source, Target>(Expression<Func<Source, Target, bool>> joinExpr, string joinFormat)
65+
public SqlExpression<T> LeftJoin<Source, Target>(Expression<Func<Source, Target, bool>> joinExpr, JoinFormatDelegate joinFormat)
6666
{
6767
return InternalJoin("LEFT JOIN", joinExpr, joinFormat);
6868
}
@@ -77,7 +77,7 @@ public SqlExpression<T> RightJoin<Target>(Expression<Func<T, Target, bool>> join
7777
return InternalJoin("RIGHT JOIN", joinExpr);
7878
}
7979

80-
public SqlExpression<T> RightJoin<Target>(Expression<Func<T, Target, bool>> joinExpr, string joinFormat)
80+
public SqlExpression<T> RightJoin<Target>(Expression<Func<T, Target, bool>> joinExpr, JoinFormatDelegate joinFormat)
8181
{
8282
if (joinFormat == null)
8383
throw new ArgumentNullException("joinFormat");
@@ -90,7 +90,7 @@ public SqlExpression<T> RightJoin<Source, Target>(Expression<Func<Source, Target
9090
return InternalJoin("RIGHT JOIN", joinExpr);
9191
}
9292

93-
public SqlExpression<T> RightJoin<Source, Target>(Expression<Func<Source, Target, bool>> joinExpr, string joinFormat)
93+
public SqlExpression<T> RightJoin<Source, Target>(Expression<Func<Source, Target, bool>> joinExpr, JoinFormatDelegate joinFormat)
9494
{
9595
return InternalJoin("RIGHT JOIN", joinExpr, joinFormat);
9696
}
@@ -115,7 +115,7 @@ public SqlExpression<T> CrossJoin<Source, Target>(Expression<Func<Source, Target
115115
return InternalJoin("CROSS JOIN", joinExpr);
116116
}
117117

118-
protected SqlExpression<T> InternalJoin<Source, Target>(string joinType, Expression<Func<Source, Target, bool>> joinExpr, string joinFormat = null)
118+
protected SqlExpression<T> InternalJoin<Source, Target>(string joinType, Expression<Func<Source, Target, bool>> joinExpr, JoinFormatDelegate joinFormat = null)
119119
{
120120
var sourceDef = typeof(Source).GetModelDefinition();
121121
var targetDef = typeof(Target).GetModelDefinition();
@@ -164,7 +164,7 @@ public SqlExpression<T> CustomJoin(string joinString)
164164
return this;
165165
}
166166

167-
private SqlExpression<T> InternalJoin(string joinType, Expression joinExpr, ModelDefinition sourceDef, ModelDefinition targetDef, string joinFormat = null)
167+
private SqlExpression<T> InternalJoin(string joinType, Expression joinExpr, ModelDefinition sourceDef, ModelDefinition targetDef, JoinFormatDelegate joinFormat = null)
168168
{
169169
PrefixFieldWithTableName = true;
170170

@@ -188,7 +188,7 @@ private SqlExpression<T> InternalJoin(string joinType, Expression joinExpr, Mode
188188
: targetDef;
189189

190190
FromExpression += joinFormat != null
191-
? " {0} {1}".Fmt(joinType, string.Format(joinFormat, SqlTable(joinDef), sqlExpr))
191+
? " {0} {1}".Fmt(joinType, joinFormat(SqlTable(joinDef), sqlExpr))
192192
: " {0} {1} {2}".Fmt(joinType, SqlTable(joinDef), sqlExpr);
193193

194194
return this;

src/ServiceStack.OrmLite/Expressions/SqlExpression.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2228,6 +2228,8 @@ public interface ISqlExpression
22282228
string SelectInto<TModel>();
22292229
}
22302230

2231+
public delegate string JoinFormatDelegate(string table, string joinExpr);
2232+
22312233
public class PartialSqlString
22322234
{
22332235
public PartialSqlString(string text)

src/ServiceStack.OrmLite/OrmLiteReadExpressionsApi.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,14 @@ public static SqlExpression<T> From<T>(this IDbConnection dbConn, string fromExp
7070
return expr;
7171
}
7272

73+
public static JoinFormatDelegate JoinAlias<T>(this IDbConnection dbConn, string alias)
74+
{
75+
var dialectProvider = dbConn.GetDialectProvider();
76+
var modelDef = typeof(T).GetModelDefinition();
77+
return (table, expr) => "{0} {1} {2}".Fmt(table, alias,
78+
expr.Replace(dialectProvider.GetQuotedTableName(modelDef), dialectProvider.GetQuotedTableName(alias)));
79+
}
80+
7381
/// <summary>
7482
/// Open a Transaction in OrmLite
7583
/// </summary>

tests/ServiceStack.OrmLite.Tests/Issues/MultipleSelfJoinsWithAliases.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,28 @@ public void Can_use_cusom_SqlExpression_to_add_multiple_self_Left_Joins()
103103
q.Where(x => x.TenantId == tenantId);
104104

105105
var sales = db.Select<SaleView>(q);
106+
Assert.That(sales.Count, Is.EqualTo(1));
106107

108+
//Alternative
109+
db.GetLastSql().Print();
110+
q = db.From<Sale>()
111+
.LeftJoin<ContactIssue>((s,c) => s.SellerId == c.Id, db.JoinAlias<ContactIssue>("seller"))
112+
.LeftJoin<ContactIssue>((s,c) => s.BuyerId == c.Id, db.JoinAlias<ContactIssue>("buyer"))
113+
.Select(@"Sale.*
114+
, buyer.{0} AS BuyerFirstName
115+
, buyer.{1} AS BuyerLastName
116+
, seller.{0} AS SellerFirstName
117+
, seller.{1} AS SellerLastName"
118+
.Fmt("FirstName".SqlColumn(), "LastName".SqlColumn()));
119+
120+
q.Where(x => x.TenantId == tenantId);
121+
122+
q.ToSelectStatement().Print();
123+
124+
sales = db.Select<SaleView>(q);
107125
Assert.That(sales.Count, Is.EqualTo(1));
126+
127+
108128
var salesView = sales[0];
109129

110130
//salesView.PrintDump();

0 commit comments

Comments
 (0)