From 3f534c69352f38295ef6280c2ece2b2af0c19f39 Mon Sep 17 00:00:00 2001 From: Keith La Force Date: Sat, 7 Jun 2014 17:57:07 -0400 Subject: [PATCH 1/2] Fixing conversion of nullable types in filter conversions --- Mvc.JQuery.Datatables/TypeFilters.cs | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/Mvc.JQuery.Datatables/TypeFilters.cs b/Mvc.JQuery.Datatables/TypeFilters.cs index 9048ad1..1b20329 100644 --- a/Mvc.JQuery.Datatables/TypeFilters.cs +++ b/Mvc.JQuery.Datatables/TypeFilters.cs @@ -6,9 +6,9 @@ namespace Mvc.JQuery.Datatables { static class TypeFilters { - private static readonly Func ParseValue = + private static readonly Func ParseValue = (input, t) => t.IsEnum ? Enum.Parse(t, input) : Convert.ChangeType(input, t); - + internal static string FilterMethod(string q, List parametersForLinqQuery, Type type) { @@ -51,7 +51,7 @@ public static string NumericFilter(string query, string columnname, ColInfo colI var clause = null as string; try { - parametersForLinqQuery.Add(Convert.ChangeType(parts[0], colInfo.Type)); + parametersForLinqQuery.Add(ChangeType(colInfo, parts[0])); clause = string.Format("{0} >= @{1}", columnname, parametersForLinqQuery.Count - 1); } catch (FormatException) @@ -60,7 +60,7 @@ public static string NumericFilter(string query, string columnname, ColInfo colI try { - parametersForLinqQuery.Add(Convert.ChangeType(parts[1], colInfo.Type)); + parametersForLinqQuery.Add(ChangeType(colInfo, parts[1])); if (clause != null) clause += " and "; clause += string.Format("{0} <= @{1}", columnname, parametersForLinqQuery.Count - 1); } @@ -74,7 +74,7 @@ public static string NumericFilter(string query, string columnname, ColInfo colI { try { - parametersForLinqQuery.Add(Convert.ChangeType(query, colInfo.Type)); + parametersForLinqQuery.Add(ChangeType(colInfo, query)); return string.Format("{0} == @{1}", columnname, parametersForLinqQuery.Count - 1); } catch (FormatException) @@ -84,6 +84,19 @@ public static string NumericFilter(string query, string columnname, ColInfo colI } } + private static object ChangeType(ColInfo colInfo, string query) + { + if (colInfo.Type.IsGenericType && colInfo.Type.GetGenericTypeDefinition() == typeof(Nullable<>)) + { + Type u = Nullable.GetUnderlyingType(colInfo.Type); + return Convert.ChangeType(query, u); + } + else + { + return Convert.ChangeType(query, colInfo.Type); + } + } + public static string DateTimeOffsetFilter(string query, string columnname, ColInfo colInfo, List parametersForLinqQuery) { if (query == "~") return string.Empty; @@ -188,7 +201,7 @@ public static string StringFilter(string q, string columnname, ColInfo columntyp public static string EnumFilter(string q, string columnname, ColInfo colInfo, List parametersForLinqQuery) { - + if (q.StartsWith("^")) q = q.Substring(1); if (q.EndsWith("$")) q = q.Substring(0, q.Length - 1); parametersForLinqQuery.Add(ParseValue(q, colInfo.Type)); From c662903991b6c36a70c12d7ff4303d9551dbcfdd Mon Sep 17 00:00:00 2001 From: Keith La Force Date: Sat, 7 Jun 2014 18:03:45 -0400 Subject: [PATCH 2/2] Adding unit test cases for nullable decimal --- Mvc.Jquery.DataTables.Tests/DummyPocos/SomeModel.cs | 1 + Mvc.Jquery.DataTables.Tests/FilterTests.cs | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Mvc.Jquery.DataTables.Tests/DummyPocos/SomeModel.cs b/Mvc.Jquery.DataTables.Tests/DummyPocos/SomeModel.cs index b90fbfb..746b3db 100644 --- a/Mvc.Jquery.DataTables.Tests/DummyPocos/SomeModel.cs +++ b/Mvc.Jquery.DataTables.Tests/DummyPocos/SomeModel.cs @@ -12,5 +12,6 @@ public class SomeModel public double Scale { get; set; } public DateTime When { get; set; } public bool Discounted { get; set; } + public decimal? Cost { get; set; } } } \ No newline at end of file diff --git a/Mvc.Jquery.DataTables.Tests/FilterTests.cs b/Mvc.Jquery.DataTables.Tests/FilterTests.cs index 011e628..583c747 100644 --- a/Mvc.Jquery.DataTables.Tests/FilterTests.cs +++ b/Mvc.Jquery.DataTables.Tests/FilterTests.cs @@ -24,7 +24,8 @@ public void Setup() DisplayName = "Cheddar", Id = 123, Scale = 123.456d, - Discounted = true + Discounted = true, + Cost = 123 } }.AsQueryable(); @@ -50,6 +51,8 @@ public void Setup() [TestCase("^456$", typeof(int), false)] //exact query, isnt match [TestCase("123", typeof(int), true)] //query, is match [TestCase("456", typeof(int), false)] //query, isnt match + [TestCase("123", typeof(decimal?), true)] //query, is match + [TestCase("456", typeof(decimal?), false)] //query, isnt match public void SearchQueryTests(string searchString, Type colType, bool returnsResult) { var col = columns.First(c => c.Item2.Type == colType).Item1;