@@ -12,7 +12,9 @@ namespace LoreSoft.Blazor.Controls.Utilities;
1212/// </summary>
1313public class LinqExpressionBuilder
1414{
15- private static readonly Dictionary < string , Action < StringBuilder , List < object ? > , QueryFilter > > _filterWriters = new ( StringComparer . OrdinalIgnoreCase ) ;
15+ private delegate void FilterWriter ( StringBuilder builder , List < object ? > parameters , QueryFilter filter , LinqExpressionOptions options ) ;
16+
17+ private static readonly Dictionary < string , FilterWriter > _filterWriters = new ( StringComparer . OrdinalIgnoreCase ) ;
1618
1719 /// <summary>
1820 /// Initializes static filter writers for supported query operators.
@@ -44,7 +46,7 @@ static LinqExpressionBuilder()
4446 /// <param name="writer">The writer action to use for the operator.</param>
4547 public static void RegisterWriter ( string @operator , Action < StringBuilder , List < object ? > , QueryFilter > writer )
4648 {
47- _filterWriters [ @operator ] = writer ;
49+ _filterWriters [ @operator ] = ( builder , parameters , filter , _ ) => writer ( builder , parameters , filter ) ;
4850 }
4951
5052 /// <summary>
@@ -100,6 +102,7 @@ public static bool IsValid(QueryFilter? queryFilter)
100102
101103 private readonly StringBuilder _expression = new ( ) ;
102104 private readonly List < object ? > _values = [ ] ;
105+ private LinqExpressionOptions _options = LinqExpressionOptions . Default ;
103106
104107 /// <summary>
105108 /// Gets the list of parameters used in the built LINQ expression. Generated by <see cref="Build(QueryRule?)"/>.
@@ -118,9 +121,20 @@ public static bool IsValid(QueryFilter? queryFilter)
118121 /// </summary>
119122 /// <param name="queryRule">The query rule to build the expression from.</param>
120123 public void Build ( QueryRule ? queryRule )
124+ => Build ( queryRule , null ) ;
125+
126+ /// <summary>
127+ /// Builds a LINQ expression string and parameter list from the specified <see cref="QueryRule"/>.
128+ /// Expression will be updated with the generated LINQ expression.
129+ /// Parameters will also be updated with the values used in the expression.
130+ /// </summary>
131+ /// <param name="queryRule">The query rule to build the expression from.</param>
132+ /// <param name="options">The options to use when building the expression.</param>
133+ public void Build ( QueryRule ? queryRule , LinqExpressionOptions ? options )
121134 {
122135 _expression . Length = 0 ;
123136 _values . Clear ( ) ;
137+ _options = options ?? LinqExpressionOptions . Default ;
124138
125139 if ( queryRule == null )
126140 return ;
@@ -205,9 +219,9 @@ private void WriteExpression(QueryFilter filter)
205219 comparison = QueryOperators . Equal ;
206220
207221 if ( _filterWriters . TryGetValue ( comparison , out var action ) )
208- action ( _expression , _values , filter ) ;
222+ action ( _expression , _values , filter , _options ) ;
209223 else
210- WriteStandardFilter ( _expression , _values , filter ) ;
224+ WriteStandardFilter ( _expression , _values , filter , _options ) ;
211225 }
212226
213227 /// <summary>
@@ -216,7 +230,8 @@ private void WriteExpression(QueryFilter filter)
216230 /// <param name="builder">The <see cref="StringBuilder"/> to append to.</param>
217231 /// <param name="parameters">The parameter list to add values to.</param>
218232 /// <param name="filter">The query filter to write.</param>
219- private static void WriteStringFilter ( StringBuilder builder , List < object ? > parameters , QueryFilter filter )
233+ /// <param name="options">The options to use when writing the expression.</param>
234+ private static void WriteStringFilter ( StringBuilder builder , List < object ? > parameters , QueryFilter filter , LinqExpressionOptions options )
220235 {
221236 // Field required for expression
222237 if ( string . IsNullOrWhiteSpace ( filter . Field ) )
@@ -254,9 +269,16 @@ private static void WriteStringFilter(StringBuilder builder, List<object?> param
254269 . Append ( '.' )
255270 . Append ( method )
256271 . Append ( "(@" )
257- . Append ( index )
258- . Append ( ", StringComparison.OrdinalIgnoreCase" )
259- . Append ( ')' ) ;
272+ . Append ( index ) ;
273+
274+ if ( options . StringComparison is { } stringComparison )
275+ {
276+ builder
277+ . Append ( ", StringComparison." )
278+ . Append ( stringComparison ) ;
279+ }
280+
281+ builder . Append ( ')' ) ;
260282
261283 parameters . Add ( value ) ;
262284 }
@@ -267,7 +289,8 @@ private static void WriteStringFilter(StringBuilder builder, List<object?> param
267289 /// <param name="builder">The <see cref="StringBuilder"/> to append to.</param>
268290 /// <param name="parameters">The parameter list to add values to.</param>
269291 /// <param name="filter">The query filter to write.</param>
270- private static void WriteStandardFilter ( StringBuilder builder , List < object ? > parameters , QueryFilter filter )
292+ /// <param name="options">The options to use when writing the expression.</param>
293+ private static void WriteStandardFilter ( StringBuilder builder , List < object ? > parameters , QueryFilter filter , LinqExpressionOptions options )
271294 {
272295 // Field required for expression
273296 if ( string . IsNullOrWhiteSpace ( filter . Field ) )
@@ -305,7 +328,8 @@ private static void WriteStandardFilter(StringBuilder builder, List<object?> par
305328 /// <param name="builder">The <see cref="StringBuilder"/> to append to.</param>
306329 /// <param name="parameters">The parameter list to add values to.</param>
307330 /// <param name="filter">The query filter to write.</param>
308- private static void WriteNullFilter ( StringBuilder builder , List < object ? > parameters , QueryFilter filter )
331+ /// <param name="options">The options to use when writing the expression.</param>
332+ private static void WriteNullFilter ( StringBuilder builder , List < object ? > parameters , QueryFilter filter , LinqExpressionOptions options )
309333 {
310334 // Field required for expression
311335 if ( string . IsNullOrWhiteSpace ( filter . Field ) )
0 commit comments