Skip to content

Commit 10d33c2

Browse files
mcintyre321Brent McSharry
authored andcommitted
Added an example using EF
1 parent 44fa0c4 commit 10d33c2

40 files changed

+48559
-90
lines changed

Mvc.JQuery.Datatables.Example/Mvc.JQuery.Datatables.Example.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@
266266
<WebProjectProperties>
267267
<UseIIS>False</UseIIS>
268268
<AutoAssignPort>True</AutoAssignPort>
269-
<DevelopmentServerPort>49660</DevelopmentServerPort>
269+
<DevelopmentServerPort>53281</DevelopmentServerPort>
270270
<DevelopmentServerVPath>/</DevelopmentServerVPath>
271271
<IISUrl>
272272
</IISUrl>

Mvc.JQuery.Datatables.sln

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mvc.JQuery.Datatables.Examp
77
EndProject
88
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mvc.JQuery.Datatables.Templates", "Mvc.JQuery.Datatables.Templates\Mvc.JQuery.Datatables.Templates.csproj", "{8DA3D5E6-D714-40C3-B6CB-E88D852C5175}"
99
EndProject
10+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Mvc.JQuery.DataTables.Tests", "Mvc.Jquery.DataTables.Tests\Mvc.JQuery.DataTables.Tests.csproj", "{53671C41-666D-4269-A12A-BA6C2F209E7A}"
11+
EndProject
1012
Global
1113
GlobalSection(SolutionConfigurationPlatforms) = preSolution
1214
Debug|Any CPU = Debug|Any CPU
@@ -25,6 +27,10 @@ Global
2527
{8DA3D5E6-D714-40C3-B6CB-E88D852C5175}.Debug|Any CPU.Build.0 = Debug|Any CPU
2628
{8DA3D5E6-D714-40C3-B6CB-E88D852C5175}.Release|Any CPU.ActiveCfg = Release|Any CPU
2729
{8DA3D5E6-D714-40C3-B6CB-E88D852C5175}.Release|Any CPU.Build.0 = Release|Any CPU
30+
{53671C41-666D-4269-A12A-BA6C2F209E7A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
31+
{53671C41-666D-4269-A12A-BA6C2F209E7A}.Debug|Any CPU.Build.0 = Debug|Any CPU
32+
{53671C41-666D-4269-A12A-BA6C2F209E7A}.Release|Any CPU.ActiveCfg = Release|Any CPU
33+
{53671C41-666D-4269-A12A-BA6C2F209E7A}.Release|Any CPU.Build.0 = Release|Any CPU
2834
EndGlobalSection
2935
GlobalSection(SolutionProperties) = preSolution
3036
HideSolutionNode = FALSE
Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
22
<s:Boolean x:Key="/Default/CodeStyle/LiveTemplatesUseVar/PreferVar/@EntryValue">False</s:Boolean>
3-
<s:Boolean x:Key="/Default/Environment/SearchAndNavigation/MergeOccurences/@EntryValue">False</s:Boolean>
3+
44
<s:String x:Key="/Default/Environment/UnitTesting/NUnitProvider/UseAddins/@EntryValue">Never</s:String>
5-
<s:Boolean x:Key="/Default/Housekeeping/SolutionSettingsUpgraded/IsUpgraded/@EntryValue">True</s:Boolean></wpf:ResourceDictionary>
5+
<s:Boolean x:Key="/Default/Housekeeping/SolutionSettingsUpgraded/IsUpgraded/@EntryValue">True</s:Boolean>
6+
<s:Boolean x:Key="/Default/Housekeeping/UnitTestingMru/UnitTestSessionPersistentData/=98F4BC003F814C2BA87B6120AD0009E9/@KeyIndexDefined">True</s:Boolean>
7+
<s:String x:Key="/Default/Housekeeping/UnitTestingMru/UnitTestSessionPersistentData/=98F4BC003F814C2BA87B6120AD0009E9/Name/@EntryValue">ThingsAreCalledCorrectly</s:String>
8+
<s:String x:Key="/Default/Housekeeping/UnitTestingMru/UnitTestSessionPersistentData/=98F4BC003F814C2BA87B6120AD0009E9/XmlSerializedElements/@EntryValue">&lt;Session&gt;&lt;Elements&gt;&lt;UnitTestElement Provider="nUnit" Id="Mvc.JQuery.DataTables.Tests.EF.EntityFramework" type="NUnitTestFixtureElement" Project="53671C41-666D-4269-A12A-BA6C2F209E7A" /&gt;&lt;UnitTestElement Provider="nUnit" Id="Mvc.JQuery.DataTables.Tests.EF.EntityFramework.I" ParentId="Mvc.JQuery.DataTables.Tests.EF.EntityFramework" type="NUnitTestElement" TypeName="Mvc.JQuery.DataTables.Tests.EF.EntityFramework" MethodName="I" Project="53671C41-666D-4269-A12A-BA6C2F209E7A" /&gt;&lt;/Elements&gt;&lt;/Session&gt;</s:String></wpf:ResourceDictionary>

Mvc.JQuery.Datatables/DataTablesFilter.cs

Lines changed: 16 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ namespace Mvc.JQuery.Datatables
77
{
88
public class DataTablesFilter
99
{
10-
public IQueryable FilterPagingSortingSearch(DataTablesParam dtParameters, IQueryable data, Tuple<string, string, Type>[] columns)
10+
public IQueryable FilterPagingSortingSearch(DataTablesParam dtParameters, IQueryable data, ColInfo[] columns)
1111
{
1212
if (!String.IsNullOrEmpty(dtParameters.sSearch))
1313
{
@@ -40,96 +40,33 @@ public IQueryable FilterPagingSortingSearch(DataTablesParam dtParameters, IQuery
4040
{
4141

4242
int columnNumber = dtParameters.iSortCol[i];
43-
string columnName = columns[columnNumber].Item1;
43+
string columnName = columns[columnNumber].Name;
4444
string sortDir = dtParameters.sSortDir[i];
4545
if (i != 0)
4646
sortString += ", ";
4747
sortString += columnName + " " + sortDir;
4848
}
49-
49+
if (string.IsNullOrWhiteSpace(sortString))
50+
{
51+
sortString = columns[0].Name;
52+
}
5053
data = data.OrderBy(sortString);
51-
54+
5255

5356
return data;
5457
}
5558

5659
public delegate string ReturnedFilteredQueryForType(string query, string columnName, Type columnType, List<object> parametersForLinqQuery);
5760

58-
static string FilterMethod(string q)
59-
{
60-
if (q.StartsWith("^"))
61-
{
62-
return "ToLower().StartsWith(\"" + q.ToLower().Substring(1).Replace("\"", "\"\"") + "\")";
63-
}
64-
else
65-
{
66-
return "ToLower().Contains(\"" + q.ToLower().Replace("\"", "\"\"") + "\")";
67-
}
68-
}
61+
6962

7063
static readonly List<ReturnedFilteredQueryForType> Filters = new List<ReturnedFilteredQueryForType>()
7164
{
72-
Guard(IsDateType, DateFilter),
73-
Guard(IsNumericType, NumericFilter)
74-
65+
Guard(IsDateType, TypeFilters.DateFilter),
66+
Guard(IsNumericType, TypeFilters.NumericFilter),
67+
Guard(arg => arg == typeof (string), TypeFilters.StringFilter),
7568
};
7669

77-
private static bool Is<T>(Type arg)
78-
{
79-
return arg is T;
80-
}
81-
82-
private static string NumericFilter(string query, string columnname, Type columnType, List<object> parametersForLinqQuery)
83-
{
84-
if (query.Contains("~"))
85-
{
86-
var parts = query.Split('~');
87-
var clause = null as string;
88-
try
89-
{
90-
parametersForLinqQuery.Add(Convert.ChangeType(parts[0], columnType));
91-
clause = string.Format("{0} >= @{1}", columnname, parametersForLinqQuery.Count - 1);
92-
}
93-
catch (FormatException)
94-
{
95-
}
96-
97-
try
98-
{
99-
parametersForLinqQuery.Add(Convert.ChangeType(parts[1], columnType));
100-
if (clause != null) clause += " and ";
101-
clause += string.Format("{0} <= @{1}", columnname, parametersForLinqQuery.Count - 1);
102-
}
103-
catch (FormatException)
104-
{
105-
}
106-
return clause ?? "true" ;
107-
108-
}
109-
else
110-
{
111-
return string.Format("({1} == null ? \"\" : {1}.ToString()).{0}", FilterMethod(query), columnname);
112-
}
113-
}
114-
115-
private static string DateFilter(string query, string columnname, Type columnType, List<object> parametersForLinqQuery)
116-
{
117-
if (query.Contains("~"))
118-
{
119-
var parts = query.Split('~');
120-
DateTimeOffset start, end;
121-
DateTimeOffset.TryParse(parts[0] ?? "", out start);
122-
if (!DateTimeOffset.TryParse(parts[1] ?? "", out end)) end = DateTimeOffset.MaxValue;
123-
124-
parametersForLinqQuery.Add(start);
125-
parametersForLinqQuery.Add(end);
126-
return string.Format("{0}.Ticks >= @{1}.Ticks and {0}.Ticks <= @{2}.Ticks", columnname, parametersForLinqQuery.Count - 2, parametersForLinqQuery.Count - 1);
127-
}
128-
else
129-
{
130-
return string.Format("{1}.ToLocalTime().ToString(\"g\").{0}", FilterMethod(query), columnname);
131-
}
132-
}
13370

13471
public delegate string GuardedFilter(string query, string columnName, Type columnType, List<object> parametersForLinqQuery);
13572

@@ -147,20 +84,21 @@ static ReturnedFilteredQueryForType Guard(Func<Type, bool> guard, GuardedFilter
14784

14885
public static void RegisterFilter<T>(GuardedFilter filter)
14986
{
150-
Filters.Add(Guard(Is<T>, filter));
87+
Filters.Add(Guard(arg => arg is T, filter));
15188
}
15289

153-
private static string GetFilterClause(string query, Tuple<string, string, Type> column, List<object> parametersForLinqQuery)
90+
private static string GetFilterClause(string query, ColInfo column, List<object> parametersForLinqQuery)
15491
{
15592
foreach (var filter in Filters)
15693
{
157-
var filteredQuery = filter(query, column.Item1, column.Item3, parametersForLinqQuery);
94+
var filteredQuery = filter(query, column.Name, column.Type, parametersForLinqQuery);
15895
if (filteredQuery != null)
15996
{
16097
return filteredQuery;
16198
}
16299
}
163-
var parts = query.Split('~').SelectMany(s => s.Split('|')).Select(q => string.Format("({1} == null ? \"\" : {1}.ToString()).{0}", FilterMethod(q), column.Item1));
100+
var parts = query.Split('~').SelectMany(s => s.Split('|'))
101+
.Select(q => string.Format("({1} == null ? \"\" : {1}.ToString()).{0}", TypeFilters.FilterMethod(q), column.Name));
164102
return "(" + string.Join(") OR (", parts) + ")";
165103
}
166104

Mvc.JQuery.Datatables/DataTablesResult.cs

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.Linq.Expressions;
12
using Mvc.JQuery.Datatables.DynamicLinq;
23
using System;
34
using System.Collections;
@@ -11,7 +12,7 @@ namespace Mvc.JQuery.Datatables
1112
{
1213
public class DataTablesResult : JsonResult
1314
{
14-
public static DataTablesResult<TRes> Create<T, TRes>(IQueryable<T> q, DataTablesParam dataTableParam, Func<T, TRes> transform)
15+
public static DataTablesResult<TRes> Create<T, TRes>(IQueryable<T> q, DataTablesParam dataTableParam, Expression<Func<T, TRes>> transform)
1516
{
1617
return new DataTablesResult<T, TRes>(q, dataTableParam, transform);
1718
}
@@ -53,16 +54,15 @@ public class DataTablesResult<T, TRes> : DataTablesResult<TRes>
5354
Guard<object>(o => (o ?? "").ToString())
5455
};
5556

56-
private readonly Func<T, TRes> _transform;
57+
private readonly Expression<Func<T, TRes>> _transform;
5758

58-
public DataTablesResult(IQueryable<T> q, DataTablesParam dataTableParam, Func<T, TRes> transform)
59+
public DataTablesResult(IQueryable<T> q, DataTablesParam dataTableParam, Expression<Func<T, TRes>> transform)
5960
{
6061
_transform = transform;
6162

6263
//var properties = typeof(TRes).GetProperties();
63-
var properties = TypeExtensions.GetSortedProperties<TRes>();
64-
65-
var content = GetResults(q, dataTableParam, properties.Select(p => Tuple.Create(p.Name, (string)null, p.PropertyType)).ToArray());
64+
65+
var content = GetResults(q, dataTableParam);
6666
this.Data = content;
6767
this.JsonRequestBehavior = JsonRequestBehavior.DenyGet;
6868
}
@@ -88,13 +88,16 @@ private static PropertyTransformer Guard<TVal>(GuardedValueTransformer<TVal> tra
8888
};
8989
}
9090

91-
private DataTablesData GetResults(IQueryable<T> data, DataTablesParam param, Tuple<string, string, Type>[] searchColumns)
91+
DataTablesData GetResults(IQueryable<T> data, DataTablesParam param)
9292
{
9393
int totalRecords = data.Count(); //annoying this, as it causes an extra evaluation..
9494

9595
var filters = new DataTablesFilter();
9696

9797
var filteredData = data.Select(_transform).AsQueryable();
98+
99+
var searchColumns = TypeExtensions.GetSortedProperties<TRes>().Select(p => new ColInfo(p.Name, p.PropertyType)).ToArray();
100+
98101
filteredData = filters.FilterPagingSortingSearch(param, filteredData, searchColumns).Cast<TRes>();
99102

100103
var page = filteredData.Skip(param.iDisplayStart);
@@ -108,7 +111,7 @@ private DataTablesData GetResults(IQueryable<T> data, DataTablesParam param, Tup
108111

109112
var properties = TypeExtensions.GetSortedProperties<TRes>();
110113

111-
var transformedPage = from i in page
114+
var transformedPage = from i in page.ToArray()
112115
let pairs = properties.Select(p => new { p.PropertyType, Value = (p.GetGetMethod().Invoke(i, null)) })
113116
let values = pairs.Select(p => GetTransformedValue(p.PropertyType, p.Value))
114117
select values;
@@ -134,4 +137,17 @@ private object GetTransformedValue(Type propertyType, object value)
134137
return (value as object ?? "").ToString();
135138
}
136139
}
140+
141+
public class ColInfo
142+
{
143+
public string Name { get; set; }
144+
public Type Type { get; set; }
145+
146+
public ColInfo(string name, Type propertyType)
147+
{
148+
Name = name;
149+
Type = propertyType;
150+
151+
}
152+
}
137153
}

Mvc.JQuery.Datatables/Mvc.JQuery.Datatables.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
<Compile Include="Properties\AssemblyInfo.cs" />
6363
<Compile Include="StaticReflectionHelper.cs" />
6464
<Compile Include="TypeExtensions.cs" />
65+
<Compile Include="TypeFilters.cs" />
6566
</ItemGroup>
6667
<ItemGroup>
6768
<EmbeddedResource Include="..\Mvc.JQuery.Datatables.Templates\Views\Shared\DataTable.cshtml">

Mvc.JQuery.Datatables/TypeExtensions.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,16 @@ orderby order
1717

1818
public static IEnumerable<PropertyInfo> GetSortedProperties<T>()
1919
{
20-
return TypeExtensions.GetSortedProperties(typeof(T));
20+
return typeof(T).GetSortedProperties();
21+
}
22+
public static IEnumerable<PropertyInfo> GetProperties(this Type t)
23+
{
24+
return from pi in t.GetProperties()
25+
select pi;
26+
}
27+
28+
public static IEnumerable<PropertyInfo> GetProperties<T>()
29+
{
30+
return typeof(T).GetSortedProperties();
2131
}
2232
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
using System;
2+
using System.Collections.Generic;
3+
4+
namespace Mvc.JQuery.Datatables
5+
{
6+
static class TypeFilters
7+
{
8+
internal static string FilterMethod(string q)
9+
{
10+
if (q.StartsWith("^"))
11+
{
12+
return "ToLower().StartsWith(\"" + q.ToLower().Substring(1).Replace("\"", "\"\"") + "\")";
13+
}
14+
else
15+
{
16+
return "ToLower().Contains(\"" + q.ToLower().Replace("\"", "\"\"") + "\")";
17+
}
18+
}
19+
public static string NumericFilter(string query, string columnname, Type columnType, List<object> parametersForLinqQuery)
20+
{
21+
if (query.Contains("~"))
22+
{
23+
var parts = query.Split('~');
24+
var clause = null as string;
25+
try
26+
{
27+
parametersForLinqQuery.Add(Convert.ChangeType(parts[0], columnType));
28+
clause = string.Format("{0} >= @{1}", columnname, parametersForLinqQuery.Count - 1);
29+
}
30+
catch (FormatException)
31+
{
32+
}
33+
34+
try
35+
{
36+
parametersForLinqQuery.Add(Convert.ChangeType(parts[1], columnType));
37+
if (clause != null) clause += " and ";
38+
clause += string.Format("{0} <= @{1}", columnname, parametersForLinqQuery.Count - 1);
39+
}
40+
catch (FormatException)
41+
{
42+
}
43+
return clause ?? "true";
44+
45+
}
46+
else
47+
{
48+
return string.Format("({1} == null ? \"\" : {1}.ToString()).{0}", FilterMethod(query), columnname);
49+
}
50+
}
51+
52+
public static string DateFilter(string query, string columnname, Type columnType, List<object> parametersForLinqQuery)
53+
{
54+
if (query.Contains("~"))
55+
{
56+
var parts = query.Split('~');
57+
DateTimeOffset start, end;
58+
DateTimeOffset.TryParse(parts[0] ?? "", out start);
59+
if (!DateTimeOffset.TryParse(parts[1] ?? "", out end)) end = DateTimeOffset.MaxValue;
60+
61+
parametersForLinqQuery.Add(start);
62+
parametersForLinqQuery.Add(end);
63+
return string.Format("{0}.Ticks >= @{1}.Ticks and {0}.Ticks <= @{2}.Ticks", columnname, parametersForLinqQuery.Count - 2, parametersForLinqQuery.Count - 1);
64+
}
65+
else
66+
{
67+
return string.Format("{1}.ToLocalTime().ToString(\"g\").{0}", FilterMethod(query), columnname);
68+
}
69+
}
70+
71+
public static string StringFilter(string q, string columnname, Type columntype, List<object> parametersforlinqquery)
72+
{
73+
if (q.StartsWith("^"))
74+
{
75+
return columnname + ".ToLower().StartsWith(\"" + q.ToLower().Replace("\"", "\"\"") + "\")";
76+
}
77+
else
78+
{
79+
return columnname + ".ToLower().Contains(\"" + q.ToLower().Replace("\"", "\"\"") + "\")";
80+
}
81+
}
82+
83+
}
84+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<configuration>
3+
<configSections>
4+
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
5+
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
6+
</configSections>
7+
<entityFramework>
8+
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
9+
</entityFramework>
10+
</configuration>

0 commit comments

Comments
 (0)