1+ using Mvc . JQuery . Datatables . DynamicLinq ;
12using System ;
23using System . Collections ;
34using System . Collections . Generic ;
45using System . Linq ;
6+ using System . Reflection ;
57using System . Web ;
68using System . Web . Mvc ;
7- using Mvc . JQuery . Datatables . DynamicLinq ;
89
910namespace Mvc . JQuery . Datatables
1011{
@@ -14,85 +15,85 @@ public static DataTablesResult<TRes> Create<T, TRes>(IQueryable<T> q, DataTables
1415 {
1516 return new DataTablesResult < T , TRes > ( q , dataTableParam , transform ) ;
1617 }
18+
1719 public static DataTablesResult < T > Create < T > ( IQueryable < T > q , DataTablesParam dataTableParam )
1820 {
1921 return new DataTablesResult < T , T > ( q , dataTableParam , t => t ) ;
2022 }
2123
22- public static DataTablesResult < T > CreateResultUsingEnumerable < T > ( IEnumerable < T > q , DataTablesParam dataTableParam )
23- {
24- return new DataTablesResult < T , T > ( q . AsQueryable ( ) , dataTableParam , t => t ) ;
25- }
26-
2724 public static DataTablesResult Create ( object queryable , DataTablesParam dataTableParam )
2825 {
29- queryable = ( ( IEnumerable ) queryable ) . AsQueryable ( ) ;
26+ queryable = ( ( IEnumerable ) queryable ) . AsQueryable ( ) ;
3027 var s = "Create" ;
3128
3229 var openCreateMethod =
33- typeof ( DataTablesResult ) . GetMethods ( ) . Single ( x => x . Name == s && x . GetGenericArguments ( ) . Count ( ) == 1 ) ;
30+ typeof ( DataTablesResult ) . GetMethods ( ) . Single ( x => x . Name == s && x . GetGenericArguments ( ) . Count ( ) == 1 ) ;
3431 var queryableType = queryable . GetType ( ) . GetGenericArguments ( ) [ 0 ] ;
3532 var closedCreateMethod = openCreateMethod . MakeGenericMethod ( queryableType ) ;
36- return ( DataTablesResult ) closedCreateMethod . Invoke ( null , new [ ] { queryable , dataTableParam } ) ;
33+ return ( DataTablesResult ) closedCreateMethod . Invoke ( null , new [ ] { queryable , dataTableParam } ) ;
3734 }
3835
36+ public static DataTablesResult < T > CreateResultUsingEnumerable < T > ( IEnumerable < T > q , DataTablesParam dataTableParam )
37+ {
38+ return new DataTablesResult < T , T > ( q . AsQueryable ( ) , dataTableParam , t => t ) ;
39+ }
3940 }
41+
4042 public class DataTablesResult < T > : DataTablesResult
4143 {
42-
4344 }
4445
45-
46-
4746 public class DataTablesResult < T , TRes > : DataTablesResult < TRes >
4847 {
48+ private static readonly List < PropertyTransformer > PropertyTransformers = new List < PropertyTransformer > ( )
49+ {
50+ Guard < DateTimeOffset > ( dateTimeOffset => dateTimeOffset . ToLocalTime ( ) . ToString ( "g" ) ) ,
51+ Guard < DateTime > ( dateTime => dateTime . ToLocalTime ( ) . ToString ( "g" ) ) ,
52+ Guard < IHtmlString > ( s => s . ToHtmlString ( ) ) ,
53+ Guard < object > ( o => ( o ?? "" ) . ToString ( ) )
54+ } ;
55+
4956 private readonly Func < T , TRes > _transform ;
5057
5158 public DataTablesResult ( IQueryable < T > q , DataTablesParam dataTableParam , Func < T , TRes > transform )
5259 {
53-
5460 _transform = transform ;
55- var properties = typeof ( TRes ) . GetProperties ( ) ;
61+
62+ //var properties = typeof(TRes).GetProperties();
63+ var properties = TypeExtensions . GetSortedProperties < TRes > ( ) ;
5664
5765 var content = GetResults ( q , dataTableParam , properties . Select ( p => Tuple . Create ( p . Name , ( string ) null , p . PropertyType ) ) . ToArray ( ) ) ;
5866 this . Data = content ;
5967 this . JsonRequestBehavior = JsonRequestBehavior . DenyGet ;
6068 }
6169
62- static readonly List < PropertyTransformer > PropertyTransformers = new List < PropertyTransformer > ( )
63- {
64- Guard < DateTimeOffset > ( dateTimeOffset => dateTimeOffset . ToLocalTime ( ) . ToString ( "g" ) ) ,
65- Guard < DateTime > ( dateTime => dateTime . ToLocalTime ( ) . ToString ( "g" ) ) ,
66- Guard < IHtmlString > ( s => s . ToHtmlString ( ) ) ,
67- Guard < object > ( o => ( o ?? "" ) . ToString ( ) )
68- } ;
70+ public delegate object GuardedValueTransformer < TVal > ( TVal value ) ;
6971
7072 public delegate object PropertyTransformer ( Type type , object value ) ;
71- public delegate object GuardedValueTransformer < TVal > ( TVal value ) ;
7273
73- static PropertyTransformer Guard < TVal > ( GuardedValueTransformer < TVal > transformer )
74+ public static void RegisterFilter < TVal > ( GuardedValueTransformer < TVal > filter )
75+ {
76+ PropertyTransformers . Add ( Guard < TVal > ( filter ) ) ;
77+ }
78+
79+ private static PropertyTransformer Guard < TVal > ( GuardedValueTransformer < TVal > transformer )
7480 {
7581 return ( t , v ) =>
7682 {
7783 if ( ! typeof ( TVal ) . IsAssignableFrom ( t ) )
7884 {
7985 return null ;
8086 }
81- return transformer ( ( TVal ) v ) ;
87+ return transformer ( ( TVal ) v ) ;
8288 } ;
8389 }
84- public static void RegisterFilter < TVal > ( GuardedValueTransformer < TVal > filter )
85- {
86- PropertyTransformers . Add ( Guard < TVal > ( filter ) ) ;
87- }
90+
8891 private DataTablesData GetResults ( IQueryable < T > data , DataTablesParam param , Tuple < string , string , Type > [ ] searchColumns )
8992 {
90-
9193 int totalRecords = data . Count ( ) ; //annoying this, as it causes an extra evaluation..
9294
9395 var filters = new DataTablesFilter ( ) ;
9496
95-
9697 var filteredData = data . Select ( _transform ) . AsQueryable ( ) ;
9798 filteredData = filters . FilterPagingSortingSearch ( param , filteredData , searchColumns ) . Cast < TRes > ( ) ;
9899
@@ -102,13 +103,15 @@ private DataTablesData GetResults(IQueryable<T> data, DataTablesParam param, Tup
102103 page = page . Take ( param . iDisplayLength ) ;
103104 }
104105
105- var type = typeof ( TRes ) ;
106- var properties = type . GetProperties ( ) ;
106+ //var type = typeof(TRes);
107+ //var propertiesOriginal = type.GetProperties();
108+
109+ var properties = TypeExtensions . GetSortedProperties < TRes > ( ) ;
107110
108111 var transformedPage = from i in page
109- let pairs = properties . Select ( p => new { p . PropertyType , Value = ( p . GetGetMethod ( ) . Invoke ( i , null ) ) } )
110- let values = pairs . Select ( p => GetTransformedValue ( p . PropertyType , p . Value ) )
111- select values ;
112+ let pairs = properties . Select ( p => new { p . PropertyType , Value = ( p . GetGetMethod ( ) . Invoke ( i , null ) ) } )
113+ let values = pairs . Select ( p => GetTransformedValue ( p . PropertyType , p . Value ) )
114+ select values ;
112115
113116 var result = new DataTablesData
114117 {
0 commit comments