Exemple #1
0
        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);
            }
        }