@@ -28,11 +28,13 @@ public static class QueryBuilder
2828 /// <typeparam name="T">The generic type.</typeparam>
2929 /// <param name="queryable">The queryable.</param>
3030 /// <param name="filterRule">The filter rule.</param>
31+ /// <param name="useIndexedProperty">Whether or not to use indexed property</param>
32+ /// <param name="indexedPropertyName">The indexable property to use</param>
3133 /// <returns>Filtered IQueryable</returns>
32- public static IQueryable < T > BuildQuery < T > ( this IEnumerable < T > queryable , FilterRule filterRule )
34+ public static IQueryable < T > BuildQuery < T > ( this IEnumerable < T > queryable , FilterRule filterRule , bool useIndexedProperty = false , string indexedPropertyName = null )
3335 {
3436 string parsedQuery ;
35- return BuildQuery ( queryable . AsQueryable ( ) , filterRule , out parsedQuery ) ;
37+ return BuildQuery ( queryable . AsQueryable ( ) , filterRule , out parsedQuery , useIndexedProperty , indexedPropertyName ) ;
3638 }
3739
3840 /// <summary>
@@ -41,11 +43,13 @@ public static IQueryable<T> BuildQuery<T>(this IEnumerable<T> queryable, FilterR
4143 /// <typeparam name="T">The generic type.</typeparam>
4244 /// <param name="queryable">The queryable.</param>
4345 /// <param name="filterRule">The filter rule.</param>
46+ /// <param name="useIndexedProperty">Whether or not to use indexed property</param>
47+ /// <param name="indexedPropertyName">The indexable property to use</param>
4448 /// <returns>Filtered IQueryable</returns>
45- public static IQueryable < T > BuildQuery < T > ( this IList < T > queryable , FilterRule filterRule )
49+ public static IQueryable < T > BuildQuery < T > ( this IList < T > queryable , FilterRule filterRule , bool useIndexedProperty = false , string indexedPropertyName = null )
4650 {
4751 string parsedQuery ;
48- return BuildQuery ( queryable . AsQueryable ( ) , filterRule , out parsedQuery ) ;
52+ return BuildQuery ( queryable . AsQueryable ( ) , filterRule , out parsedQuery , useIndexedProperty , indexedPropertyName ) ;
4953 }
5054
5155 /// <summary>
@@ -54,11 +58,13 @@ public static IQueryable<T> BuildQuery<T>(this IList<T> queryable, FilterRule fi
5458 /// <typeparam name="T">The generic type.</typeparam>
5559 /// <param name="queryable">The queryable.</param>
5660 /// <param name="filterRule">The filter rule.</param>
61+ /// <param name="useIndexedProperty">Whether or not to use indexed property</param>
62+ /// <param name="indexedPropertyName">The indexable property to use</param>
5763 /// <returns>Filtered IQueryable</returns>
58- public static IQueryable < T > BuildQuery < T > ( this IQueryable < T > queryable , FilterRule filterRule )
64+ public static IQueryable < T > BuildQuery < T > ( this IQueryable < T > queryable , FilterRule filterRule , bool useIndexedProperty = false , string indexedPropertyName = null )
5965 {
6066 string parsedQuery ;
61- return BuildQuery ( queryable , filterRule , out parsedQuery ) ;
67+ return BuildQuery ( queryable , filterRule , out parsedQuery , useIndexedProperty , indexedPropertyName ) ;
6268 }
6369
6470 /// <summary>
@@ -69,8 +75,10 @@ public static IQueryable<T> BuildQuery<T>(this IQueryable<T> queryable, FilterRu
6975 /// <param name="queryable">The queryable.</param>
7076 /// <param name="filterRule">The filter rule.</param>
7177 /// <param name="parsedQuery">The parsed query.</param>
78+ /// <param name="useIndexedProperty">Whether or not to use indexed property</param>
79+ /// <param name="indexedPropertyName">The indexable property to use</param>
7280 /// <returns>Filtered IQueryable.</returns>
73- public static IQueryable < T > BuildQuery < T > ( this IQueryable < T > queryable , FilterRule filterRule , out string parsedQuery )
81+ public static IQueryable < T > BuildQuery < T > ( this IQueryable < T > queryable , FilterRule filterRule , out string parsedQuery , bool useIndexedProperty = false , string indexedPropertyName = null )
7482 {
7583 if ( filterRule == null )
7684 {
@@ -80,7 +88,7 @@ public static IQueryable<T> BuildQuery<T>(this IQueryable<T> queryable, FilterRu
8088
8189 var pe = Expression . Parameter ( typeof ( T ) , "item" ) ;
8290
83- var expressionTree = BuildExpressionTree ( pe , filterRule ) ;
91+ var expressionTree = BuildExpressionTree ( pe , filterRule , useIndexedProperty , indexedPropertyName ) ;
8492 if ( expressionTree == null )
8593 {
8694 parsedQuery = "" ;
@@ -102,13 +110,13 @@ public static IQueryable<T> BuildQuery<T>(this IQueryable<T> queryable, FilterRu
102110
103111 }
104112
105- private static Expression BuildExpressionTree ( ParameterExpression pe , FilterRule rule )
113+ private static Expression BuildExpressionTree ( ParameterExpression pe , FilterRule rule , bool useIndexedProperty = false , string indexedPropertyName = null )
106114 {
107115
108116 if ( rule . Rules != null && rule . Rules . Any ( ) )
109117 {
110118 var expressions =
111- rule . Rules . Select ( childRule => BuildExpressionTree ( pe , childRule ) )
119+ rule . Rules . Select ( childRule => BuildExpressionTree ( pe , childRule , useIndexedProperty , indexedPropertyName ) )
112120 . Where ( expression => expression != null )
113121 . ToList ( ) ;
114122
@@ -151,7 +159,15 @@ private static Expression BuildExpressionTree(ParameterExpression pe, FilterRule
151159 throw new Exception ( $ "Unexpected data type { rule . Type } ") ;
152160 }
153161
154- var propertyExp = Expression . Property ( pe , rule . Field ) ;
162+ Expression propertyExp = null ;
163+ if ( useIndexedProperty )
164+ {
165+ propertyExp = Expression . Property ( pe , indexedPropertyName , Expression . Constant ( rule . Field ) ) ;
166+ }
167+ else
168+ {
169+ propertyExp = Expression . Property ( pe , rule . Field ) ;
170+ }
155171
156172 Expression expression ;
157173
0 commit comments