public SearchResult <TData> Search(SearchRequest <TData> request) { try { SearchResult <TData> result = new SearchResult <TData>(); var records = _db.Query <TData>("select * from " + _repoName); var recordCount = records.Select(x => x); if (request.Filter != null) { records = records.AsQueryable <TData>().Where(request.Filter); recordCount = recordCount.AsQueryable <TData>().Where(request.Filter); } result.SearchTotal = recordCount.Count(); if (result.SearchTotal == 0) { result.Items = new List <TData>().AsQueryable(); result.Message = string.Format("No " + _repoName + " matched search filters"); return(result); } if (request.Sort != null && request.Sort.Count() > 0) { IOrderedQueryable <TData> sortedRecords = null; foreach (var sortExpression in request.Sort.ToList()) { var sort = sortExpression.Sort.RemapForType <TData, TData, object>(); if (sortedRecords == null) { sortedRecords = records.AsQueryable().ObjectSort <TData>(sort, sortExpression.IsAscending, false); } else { sortedRecords = sortedRecords.ObjectSort <TData>(sort, sortExpression.IsAscending, true); } } records = sortedRecords; } else { records = records.AsQueryable().OrderBy(x => x.Id); } int actualPageSize = request.PageSize == 0 ? result.SearchTotal : request.PageSize; result.SearchPages = result.SearchTotal / actualPageSize; int div = result.SearchTotal % actualPageSize; result.SearchPages = div != 0 ? ++result.SearchPages : result.SearchPages; var finalRecords = records.Skip(request.PageIndex * request.PageSize).Take(actualPageSize).AsEnumerable(); result.Items = finalRecords.Select(x => x).AsQueryable(); return(result); } catch (Exception e) { _db.Close(); return(null); } }