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

Commit 1664e8f

Browse files
committed
Avoid using ON on Cross Joins which fails in SqlServer
1 parent 36bd479 commit 1664e8f

File tree

1 file changed

+9
-7
lines changed

1 file changed

+9
-7
lines changed

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

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,12 @@ private SqlExpression<T> InternalJoin<Source, Target>(string joinType,
8484
return InternalJoin(joinType, joinExpr, sourceDef, targetDef);
8585
}
8686

87-
private string InternalCreateSqlFromExpression(Expression joinExpr)
87+
private string InternalCreateSqlFromExpression(Expression joinExpr, bool isCrossJoin)
8888
{
89-
return "ON {0}".Fmt(Visit(joinExpr).ToString());
89+
return "{0} {1}".Fmt((isCrossJoin ? "WHERE" : "ON"), Visit(joinExpr).ToString());
9090
}
9191

92-
private string InternalCreateSqlFromDefinitions(ModelDefinition sourceDef, ModelDefinition targetDef, bool allowMissingOnClause)
92+
private string InternalCreateSqlFromDefinitions(ModelDefinition sourceDef, ModelDefinition targetDef, bool isCrossJoin)
9393
{
9494
var parentDef = sourceDef;
9595
var childDef = targetDef;
@@ -104,13 +104,14 @@ private string InternalCreateSqlFromDefinitions(ModelDefinition sourceDef, Model
104104

105105
if (refField == null)
106106
{
107-
if(!allowMissingOnClause)
107+
if(!isCrossJoin)
108108
throw new ArgumentException("Could not infer relationship between {0} and {1}".Fmt(sourceDef.ModelName, targetDef.ModelName));
109109

110110
return string.Empty;
111111
}
112112

113-
return "ON\n({0}.{1} = {2}.{3})".Fmt(
113+
return "{0}\n({1}.{2} = {3}.{4})".Fmt(
114+
isCrossJoin ? "WHERE" : "ON",
114115
DialectProvider.GetQuotedTableName(parentDef),
115116
SqlColumn(parentDef.PrimaryKey.FieldName),
116117
DialectProvider.GetQuotedTableName(childDef),
@@ -126,9 +127,10 @@ private SqlExpression<T> InternalJoin(string joinType,
126127
useFieldName = true;
127128
sep = " ";
128129

130+
var isCrossJoin = "CROSS JOIN".Equals(joinType);
129131
var sqlExpr = joinExpr != null
130-
? InternalCreateSqlFromExpression(joinExpr)
131-
: InternalCreateSqlFromDefinitions(sourceDef, targetDef, "CROSS JOIN".Equals(joinType));
132+
? InternalCreateSqlFromExpression(joinExpr, isCrossJoin)
133+
: InternalCreateSqlFromDefinitions(sourceDef, targetDef, isCrossJoin);
132134

133135
var joinDef = tableDefs.Contains(targetDef) && !tableDefs.Contains(sourceDef)
134136
? sourceDef

0 commit comments

Comments
 (0)