@@ -111,7 +111,7 @@ public virtual SqlExpression<T> Select()
111
111
/// set the specified selectExpression.
112
112
/// </summary>
113
113
/// <param name='selectExpression'>
114
- /// raw Select expression: "Select SomeField1, SomeField2 from SomeTable"
114
+ /// raw Select expression: "SomeField1, SomeField2 from SomeTable"
115
115
/// </param>
116
116
public virtual SqlExpression < T > Select ( string selectExpression )
117
117
{
@@ -120,15 +120,30 @@ public virtual SqlExpression<T> Select(string selectExpression)
120
120
return UnsafeSelect ( selectExpression ) ;
121
121
}
122
122
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 )
124
139
{
125
140
if ( string . IsNullOrEmpty ( rawSelect ) )
126
141
{
127
- BuildSelectExpression ( string . Empty , false ) ;
142
+ BuildSelectExpression ( string . Empty , distinct : distinct ) ;
128
143
}
129
144
else
130
145
{
131
- this . selectExpression = "SELECT " + rawSelect ;
146
+ this . selectExpression = "SELECT " + ( distinct ? "DISTINCT " : "" ) + rawSelect ;
132
147
this . CustomSelect = true ;
133
148
OnlyFields = null ;
134
149
}
@@ -141,7 +156,17 @@ public virtual SqlExpression<T> UnsafeSelect(string rawSelect)
141
156
/// <param name='fields'>
142
157
/// Matching Fields: "SomeField1, SomeField2"
143
158
/// </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 )
145
170
{
146
171
if ( fields == null || fields . Length == 0 )
147
172
return Select ( string . Empty ) ;
@@ -192,7 +217,7 @@ public virtual SqlExpression<T> Select(string[] fields)
192
217
sb . Append ( qualifiedName ) ;
193
218
}
194
219
195
- UnsafeSelect ( StringBuilderCache . ReturnAndFree ( sb ) ) ;
220
+ UnsafeSelect ( StringBuilderCache . ReturnAndFree ( sb ) , distinct : distinct ) ;
196
221
OnlyFields = new HashSet < string > ( fieldsList , StringComparer . OrdinalIgnoreCase ) ;
197
222
198
223
return this ;
0 commit comments