-
Notifications
You must be signed in to change notification settings - Fork 3
/
BootstrapTableHelper.cs
165 lines (147 loc) · 5.8 KB
/
BootstrapTableHelper.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
using Microsoft.Ajax.Utilities;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Dynamic;
using System.Linq;
using System.Linq.Dynamic;
namespace HMVella
{
public class BootstrapTableHelper
{
public string GenerateTable<T>(IQueryable<T> objectList, int pageSize, int pageNumber, string sortBy, string sortOrder = "Asc", string searchString = "", bool searchStartOnly = false, bool caseSensitive = false)
{
var results = FilterData(objectList, searchString, sortBy, sortOrder, searchStartOnly, caseSensitive);
var jsonTableData = BootstrapTableFormatter(results, pageSize, pageNumber);
return jsonTableData;
}
public DataTable ToDataTable<T>(IList<T> list, string tableName = "table")
{
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T));
DataTable table = new DataTable();
for (int i = 0; i < props.Count; i++)
{
PropertyDescriptor prop = props[i];
table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
}
object[] values = new object[props.Count];
foreach (T item in list)
{
for (int i = 0; i < values.Length; i++)
values[i] = props[i].GetValue(item) ?? DBNull.Value;
table.Rows.Add(values);
}
table.TableName = tableName;
return table;
}
private string BootstrapTableFormatter<T>(IQueryable<T> objectList, int pageSize, int pageNumber)
{
var skip = (pageNumber - 1) * pageSize;
var listCount = objectList.Count();
dynamic expandoObject = new ExpandoObject();
expandoObject.total = listCount;
if(objectList.Count() > skip)
{
expandoObject.rows = objectList.Skip(skip).Take(pageSize).ToList();
}
else
{
expandoObject.rows = objectList.Take(pageSize).ToList();
}
string json = JsonConvert.SerializeObject(expandoObject, new JsonSerializerSettings
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
});
return json;
}
private IQueryable<T> FilterData<T>(IQueryable<T> objectList, string search, string sortBy, string sortOrder, bool searchStartOnly, bool caseSensitive)
{
string query = "";
if (!objectList.Any())
{
return objectList;
}
//Dynamic Search
if (!search.IsNullOrWhiteSpace())
{
search = search.ToLower();
query = SearchQueryGenerator(objectList, search, searchStartOnly, caseSensitive);
objectList = objectList.Where(query);
}
//Dynamic Order By
if (!sortBy.IsNullOrWhiteSpace() && !sortOrder.IsNullOrWhiteSpace())
{
objectList = objectList.OrderBy($"{sortBy} {sortOrder}");
}
return objectList;
}
private List<Searchable> GetSearchableColumns<T>(IQueryable<T> objectList)
{
var first = objectList.FirstOrDefault();
if (first == null)
{
return null;
}
List<Searchable> searchableList = new List<Searchable>();
var properties = objectList.First().GetType().GetProperties();
foreach (var property in properties)
{
var name = property.Name;
var type = property.PropertyType;
if (type == typeof(string) || type == typeof(float) ||
type == typeof(double) || type == typeof(int) ||
type == typeof(decimal) || type == typeof(long))
{
searchableList.Add(new Searchable
{
Name = name,
Type = type
});
}
}
return searchableList;
}
private string SearchQueryGenerator<T>(IQueryable<T> objectList, string searchString, bool searchStartOnly, bool caseSensitive)
{
var searchFloat = -9001.0f;
var isNumber = float.TryParse(searchString, out searchFloat);
var searchable = GetSearchableColumns(objectList);
var searchableStrings = searchable.Where(c => c.Type == typeof(string));
var searchableNums = searchable.Except(searchableStrings);
var queryList = new List<string>();
var searchType = ".Contains";
if (searchStartOnly)
{
searchType = ".StartsWith";
}
var sensitivityString = "";
if (!caseSensitive)
{
sensitivityString = ".ToUpper()";
searchString = searchString.ToUpper();
}
foreach (var str in searchableStrings)
{
var queryString = $"{str.Name}{sensitivityString}{searchType}(\"{searchString}\")";
queryList.Add(queryString);
}
if (isNumber)
{
foreach (var num in searchableNums)
{
var queryString = $"{num.Name}.ToString(){sensitivityString}{searchType}(\"{searchString}\")";
queryList.Add(queryString);
}
}
var combinedQuery = string.Join(" || ", queryList);
return combinedQuery;
}
private class Searchable
{
public string Name;
public Type Type;
}
}
}