public virtual ActionResult DataTables(DataTableCriteria searchCriteria)
        {
            // Generate Data
            List <DataTableRecord> allRecords = new List <DataTableRecord>();

            int idCount   = 0;
            int cellCount = 0;

            for (int i = 0; i < 100; i++)
            {
                allRecords.Add(new DataTableRecord()
                {
                    Id = ++idCount, Column1 = "cell " + (++cellCount).ToString(), Column2 = "cell " + (++cellCount).ToString(), Column3 = "cell " + (++cellCount).ToString()
                });
            }

            // Apply search criteria to data
            var filteredRecord = allRecords.ApplyCriteria(searchCriteria);

            // TODO: Apply searching in the ApplyCriteria function eventually...
            if (!string.IsNullOrWhiteSpace(searchCriteria.GlobalSearchText))
            {
                filteredRecord = filteredRecord.Where(e => e.Column1.Contains(searchCriteria.GlobalSearchText) || e.Column2.Contains(searchCriteria.GlobalSearchText) || e.Column3.Contains(searchCriteria.GlobalSearchText)).ToList();
            }


            // Create response
            var result = new DataGridResult <DataTableRecord>();

            result.Data             = filteredRecord.ToList();
            result.DisplayedRecords = allRecords.Count();
            result.TotalRecords     = allRecords.Count();

            return(Json(result));
        }
        public static IEnumerable <TEntity> ApplyCriteria <TEntity>(this IEnumerable <TEntity> query, DataTableCriteria criteria)
        {
            if (criteria == null)
            {
                return(query);
            }

            // Apply ordering to query.
            IList <DataTableColumnCriteria> columnCriteria = criteria.Columns
                                                             .Where(e => e.IsSorted)
                                                             .OrderBy(e => e.SortOrder)
                                                             .ToList();

            int k = 0;

            foreach (var c in columnCriteria)
            {
                if (c.SortDirection == SortDirection.Ascending)
                {
                    if (k == 0)
                    {
                        query = query.AsQueryable().ApplyOrder(c.ColumnName, QuerySortOrder.OrderBy);
                    }
                    else
                    {
                        query = query.AsQueryable().ApplyOrder(c.ColumnName, QuerySortOrder.ThenBy);
                    }
                }
                else
                {
                    if (k == 0)
                    {
                        query = query.AsQueryable().ApplyOrder(c.ColumnName, QuerySortOrder.OrderByDescending);
                    }
                    else
                    {
                        query = query.AsQueryable().ApplyOrder(c.ColumnName, QuerySortOrder.ThenByDescending);
                    }
                }

                k++;
            }

            // Apply paging to query..
            query = query
                    .Skip(criteria.RecordsToSkip)
                    .Take(criteria.RecordsToTake);

            return(query);
        }