Skip to content

Commit 89b3df1

Browse files
committed
Fixed enum filtering
1 parent 0b796f5 commit 89b3df1

File tree

2 files changed

+40
-18
lines changed

2 files changed

+40
-18
lines changed

Mvc.JQuery.Datatables/DataTablesFilter.cs

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -59,23 +59,25 @@ public IQueryable FilterPagingSortingSearch(DataTablesParam dtParameters, IQuery
5959
return data;
6060
}
6161

62-
public delegate string ReturnedFilteredQueryForType(string query, string columnName, Type columnType, List<object> parametersForLinqQuery);
62+
public delegate string ReturnedFilteredQueryForType(
63+
string query, string columnName, Type columnType, List<object> parametersForLinqQuery);
6364

6465

65-
66-
static readonly List<ReturnedFilteredQueryForType> Filters = new List<ReturnedFilteredQueryForType>()
66+
private static readonly List<ReturnedFilteredQueryForType> Filters = new List<ReturnedFilteredQueryForType>()
6767
{
6868
Guard(IsBoolType, TypeFilters.BoolFilter),
6969
Guard(IsDateTimeType, TypeFilters.DateTimeFilter),
7070
Guard(IsDateTimeOffsetType, TypeFilters.DateTimeOffsetFilter),
7171
Guard(IsNumericType, TypeFilters.NumericFilter),
72+
Guard(IsEnumType, TypeFilters.EnumFilter),
7273
Guard(arg => arg == typeof (string), TypeFilters.StringFilter),
7374
};
7475

7576

76-
public delegate string GuardedFilter(string query, string columnName, Type columnType, List<object> parametersForLinqQuery);
77+
public delegate string GuardedFilter(
78+
string query, string columnName, Type columnType, List<object> parametersForLinqQuery);
7779

78-
static ReturnedFilteredQueryForType Guard(Func<Type, bool> guard, GuardedFilter filter)
80+
private static ReturnedFilteredQueryForType Guard(Func<Type, bool> guard, GuardedFilter filter)
7981
{
8082
return (q, c, t, p) =>
8183
{
@@ -94,19 +96,20 @@ public static void RegisterFilter<T>(GuardedFilter filter)
9496

9597
private static string GetFilterClause(string query, ColInfo column, List<object> parametersForLinqQuery)
9698
{
97-
foreach (var filter in Filters)
99+
Func<string, string> filterClause = (queryPart) =>
100+
Filters.Select(
101+
f => f(queryPart, column.Name, column.Type, parametersForLinqQuery))
102+
.First(filterPart => filterPart != null);
103+
104+
var queryParts = query.Split('|').Select(filterClause).Where(fc => fc != "").ToArray();
105+
if (queryParts.Any())
98106
{
99-
var filteredQuery = filter(query, column.Name, column.Type, parametersForLinqQuery);
100-
if (filteredQuery != null)
101-
{
102-
return filteredQuery;
103-
}
107+
return "(" + string.Join(") OR (", queryParts) + ")";
104108
}
105-
var parts = query.Split('~').SelectMany(s => s.Split('|'))
106-
.Select(q => string.Format("({1} == null ? \"\" : {1}.ToString()).{0}", TypeFilters.FilterMethod(q, parametersForLinqQuery, column.Type), column.Name));
107-
return "(" + string.Join(") OR (", parts) + ")";
109+
return null;
108110
}
109111

112+
110113
public static bool IsNumericType(Type type)
111114
{
112115
if (type == null || type.IsEnum)
@@ -138,6 +141,11 @@ public static bool IsNumericType(Type type)
138141
return false;
139142

140143
}
144+
public static bool IsEnumType(Type type)
145+
{
146+
return type.IsEnum;
147+
}
148+
141149
public static bool IsBoolType(Type type)
142150
{
143151
return type == typeof(bool) || type == typeof(bool?);
@@ -148,7 +156,7 @@ public static bool IsDateTimeType(Type type)
148156
}
149157
public static bool IsDateTimeOffsetType(Type type)
150158
{
151-
return type == typeof(DateTimeOffset) || type == typeof(DateTimeOffset?);
159+
return type == typeof(DateTimeOffset) || type == typeof(DateTimeOffset?);
152160
}
153161

154162
}

Mvc.JQuery.Datatables/TypeFilters.cs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,24 @@ namespace Mvc.JQuery.Datatables
66
{
77
static class TypeFilters
88
{
9+
private static readonly Func<string, Type, object> ParseValue =
10+
(input, t) => t.IsEnum ? Enum.Parse(t, input) : Convert.ChangeType(input, t);
11+
912
internal static string FilterMethod(string q, List<object> parametersForLinqQuery, Type type)
1013
{
11-
Func<string, string, string> makeClause = ( method, query) =>
14+
15+
16+
Func<string, string, string> makeClause = (method, query) =>
1217
{
13-
parametersForLinqQuery.Add(Convert.ChangeType(query, type));
18+
parametersForLinqQuery.Add(ParseValue(query, type));
1419
var indexOfParameter = parametersForLinqQuery.Count - 1;
1520
return string.Format("{0}(@{1})", method, indexOfParameter);
1621
};
1722
if (q.StartsWith("^"))
1823
{
1924
if (q.EndsWith("$"))
2025
{
21-
parametersForLinqQuery.Add(Convert.ChangeType(q.Substring(1, q.Length -2), type));
26+
parametersForLinqQuery.Add(ParseValue(q.Substring(1, q.Length - 2), type));
2227
var indexOfParameter = parametersForLinqQuery.Count - 1;
2328
return string.Format("Equals((object)@{0})", indexOfParameter);
2429
}
@@ -158,5 +163,14 @@ public static string StringFilter(string q, string columnname, Type columntype,
158163
columnname, parameterArg);
159164
}
160165
}
166+
167+
public static string EnumFilter(string q, string columnname, Type type, List<object> parametersForLinqQuery)
168+
{
169+
170+
if (q.StartsWith("^")) q = q.Substring(1);
171+
if (q.EndsWith("$")) q = q.Substring(0, q.Length - 1);
172+
parametersForLinqQuery.Add(ParseValue(q, type));
173+
return columnname + " == @" + (parametersForLinqQuery.Count - 1);
174+
}
161175
}
162176
}

0 commit comments

Comments
 (0)