@@ -65,7 +65,17 @@ public SqlExpression<T> FullJoin<Source, Target>(Expression<Func<Source, Target,
6565 return InternalJoin ( "FULL JOIN" , joinExpr ) ;
6666 }
6767
68- private SqlExpression < T > InternalJoin < Source , Target > ( string joinType ,
68+ public SqlExpression < T > CrossJoin < Target > ( Expression < Func < T , Target , bool > > joinExpr = null )
69+ {
70+ return InternalJoin ( "CROSS JOIN" , joinExpr ) ;
71+ }
72+
73+ public SqlExpression < T > CrossJoin < Source , Target > ( Expression < Func < Source , Target , bool > > joinExpr = null )
74+ {
75+ return InternalJoin ( "CROSS JOIN" , joinExpr ) ;
76+ }
77+
78+ private SqlExpression < T > InternalJoin < Source , Target > ( string joinType ,
6979 Expression < Func < Source , Target , bool > > joinExpr )
7080 {
7181 var sourceDef = typeof ( Source ) . GetModelDefinition ( ) ;
@@ -74,59 +84,56 @@ private SqlExpression<T> InternalJoin<Source, Target>(string joinType,
7484 return InternalJoin ( joinType , joinExpr , sourceDef , targetDef ) ;
7585 }
7686
77- private SqlExpression < T > InternalJoin ( string joinType ,
78- Expression joinExpr , ModelDefinition sourceDef , ModelDefinition targetDef )
87+ private string InternalCreateSqlFromExpression ( Expression joinExpr )
7988 {
80- PrefixFieldWithTableName = true ;
81-
82- var fromExpr = FromExpression ;
83- var sbJoin = new StringBuilder ( ) ;
84-
85- string sqlExpr ;
89+ return "ON {0}" . Fmt ( Visit ( joinExpr ) . ToString ( ) ) ;
90+ }
8691
87- //Changes how Sql Expressions are generated.
88- useFieldName = true ;
89- sep = " " ;
92+ private string InternalCreateSqlFromDefinitions ( ModelDefinition sourceDef , ModelDefinition targetDef , bool allowMissingOnClause )
93+ {
94+ var parentDef = sourceDef ;
95+ var childDef = targetDef ;
9096
91- if ( joinExpr != null )
97+ var refField = OrmLiteReadCommandExtensions . GetRefFieldDefIfExists ( parentDef , childDef ) ;
98+ if ( refField == null )
9299 {
93- sqlExpr = Visit ( joinExpr ) . ToString ( ) ;
100+ parentDef = targetDef ;
101+ childDef = sourceDef ;
102+ refField = OrmLiteReadCommandExtensions . GetRefFieldDefIfExists ( parentDef , childDef ) ;
94103 }
95- else
104+
105+ if ( refField == null )
96106 {
97- var parentDef = sourceDef ;
98- var childDef = targetDef ;
107+ if ( ! allowMissingOnClause )
108+ throw new ArgumentException ( "Could not infer relationship between {0} and {1}" . Fmt ( sourceDef . ModelName , targetDef . ModelName ) ) ;
99109
100- var refField = OrmLiteReadCommandExtensions . GetRefFieldDefIfExists ( parentDef , childDef ) ;
101- if ( refField == null )
102- {
103- parentDef = targetDef ;
104- childDef = sourceDef ;
105- refField = OrmLiteReadCommandExtensions . GetRefFieldDefIfExists ( parentDef , childDef ) ;
106- }
110+ return string . Empty ;
111+ }
107112
108- if ( refField == null )
109- {
110- throw new ArgumentException ( "Could not infer relationship between {0} and {1}"
111- . Fmt ( sourceDef . ModelName , targetDef . ModelName ) ) ;
112- }
113+ return "ON\n ({0}.{1} = {2}.{3})" . Fmt (
114+ DialectProvider . GetQuotedTableName ( parentDef ) ,
115+ SqlColumn ( parentDef . PrimaryKey . FieldName ) ,
116+ DialectProvider . GetQuotedTableName ( childDef ) ,
117+ SqlColumn ( refField . FieldName ) ) ;
118+ }
113119
114- sqlExpr = "\n ({0}.{1} = {2}.{3})" . Fmt (
115- DialectProvider . GetQuotedTableName ( parentDef ) ,
116- SqlColumn ( parentDef . PrimaryKey . FieldName ) ,
117- DialectProvider . GetQuotedTableName ( childDef ) ,
118- SqlColumn ( refField . FieldName ) ) ;
119- }
120+ private SqlExpression < T > InternalJoin ( string joinType ,
121+ Expression joinExpr , ModelDefinition sourceDef , ModelDefinition targetDef )
122+ {
123+ PrefixFieldWithTableName = true ;
124+
125+ //Changes how Sql Expressions are generated.
126+ useFieldName = true ;
127+ sep = " " ;
128+
129+ string sqlExpr = joinExpr != null ? InternalCreateSqlFromExpression ( joinExpr )
130+ : InternalCreateSqlFromDefinitions ( sourceDef , targetDef , "CROSS JOIN" . Equals ( joinType ) ) ;
120131
121132 var joinDef = tableDefs . Contains ( targetDef ) && ! tableDefs . Contains ( sourceDef )
122133 ? sourceDef
123134 : targetDef ;
124135
125- sbJoin . Append ( " {0} {1} " . Fmt ( joinType , SqlTable ( joinDef ) ) ) ;
126- sbJoin . Append ( " ON " ) ;
127- sbJoin . Append ( sqlExpr ) ;
128-
129- FromExpression = fromExpr + sbJoin ;
136+ FromExpression += " {0} {1} {2}" . Fmt ( joinType , SqlTable ( joinDef ) , sqlExpr ) ;
130137
131138 if ( ! tableDefs . Contains ( sourceDef ) )
132139 tableDefs . Add ( sourceDef ) ;
0 commit comments