@@ -111,7 +111,7 @@ public virtual SqlExpression<T> Select()
111111 /// set the specified selectExpression.
112112 /// </summary>
113113 /// <param name='selectExpression'>
114- /// raw Select expression: "Select SomeField1, SomeField2 from SomeTable"
114+ /// raw Select expression: "SomeField1, SomeField2 from SomeTable"
115115 /// </param>
116116 public virtual SqlExpression < T > Select ( string selectExpression )
117117 {
@@ -120,15 +120,30 @@ public virtual SqlExpression<T> Select(string selectExpression)
120120 return UnsafeSelect ( selectExpression ) ;
121121 }
122122
123- public virtual SqlExpression < T > UnsafeSelect ( string rawSelect )
123+ /// <summary>
124+ /// set the specified DISTINCT selectExpression.
125+ /// </summary>
126+ /// <param name='selectExpression'>
127+ /// raw Select expression: "SomeField1, SomeField2 from SomeTable"
128+ /// </param>
129+ public virtual SqlExpression < T > SelectDistinct ( string selectExpression )
130+ {
131+ selectExpression ? . SqlVerifyFragment ( ) ;
132+
133+ return UnsafeSelect ( selectExpression , distinct : true ) ;
134+ }
135+
136+ public virtual SqlExpression < T > UnsafeSelect ( string rawSelect ) => UnsafeSelect ( rawSelect , distinct : false ) ;
137+
138+ public virtual SqlExpression < T > UnsafeSelect ( string rawSelect , bool distinct )
124139 {
125140 if ( string . IsNullOrEmpty ( rawSelect ) )
126141 {
127- BuildSelectExpression ( string . Empty , false ) ;
142+ BuildSelectExpression ( string . Empty , distinct : distinct ) ;
128143 }
129144 else
130145 {
131- this . selectExpression = "SELECT " + rawSelect ;
146+ this . selectExpression = "SELECT " + ( distinct ? "DISTINCT " : "" ) + rawSelect ;
132147 this . CustomSelect = true ;
133148 OnlyFields = null ;
134149 }
@@ -141,7 +156,17 @@ public virtual SqlExpression<T> UnsafeSelect(string rawSelect)
141156 /// <param name='fields'>
142157 /// Matching Fields: "SomeField1, SomeField2"
143158 /// </param>
144- public virtual SqlExpression < T > Select ( string [ ] fields )
159+ public virtual SqlExpression < T > Select ( string [ ] fields ) => Select ( fields , distinct : false ) ;
160+
161+ /// <summary>
162+ /// Set the specified DISTINCT selectExpression using matching fields.
163+ /// </summary>
164+ /// <param name='fields'>
165+ /// Matching Fields: "SomeField1, SomeField2"
166+ /// </param>
167+ public virtual SqlExpression < T > SelectDistinct ( string [ ] fields ) => Select ( fields , distinct : true ) ;
168+
169+ internal virtual SqlExpression < T > Select ( string [ ] fields , bool distinct )
145170 {
146171 if ( fields == null || fields . Length == 0 )
147172 return Select ( string . Empty ) ;
@@ -192,7 +217,7 @@ public virtual SqlExpression<T> Select(string[] fields)
192217 sb . Append ( qualifiedName ) ;
193218 }
194219
195- UnsafeSelect ( StringBuilderCache . ReturnAndFree ( sb ) ) ;
220+ UnsafeSelect ( StringBuilderCache . ReturnAndFree ( sb ) , distinct : distinct ) ;
196221 OnlyFields = new HashSet < string > ( fieldsList , StringComparer . OrdinalIgnoreCase ) ;
197222
198223 return this ;
0 commit comments