public async Task <IEnumerable <TEntity> > Find(PaginationState pgState = null)
        {
            try
            {
                return(await Task.Run(() => _prnt.DbSet
                                      .SkipRemoved()
                                      .SkipTake(pgState ?? _prnt.PgnState)
                                      .ExtWhere(pgState ?? _prnt.PgnState)));
            }
            catch (Exception ex)
            { Debug.WriteLine(ex.StackTrace); }

            return(null);
        }
 public static IQueryable <TEntity> SkipTake <TEntity>(this IQueryable <TEntity> items, PaginationState state) where TEntity : ExtEntity
 => items.Skip(state.ToSkip).Take(state.RowsCountPerPage);
        public static IEnumerable <TEntity> ExtOrder <TEntity>(this IEnumerable <TEntity> items, PaginationState state) where TEntity : ExtEntity
        {
            var func = new Func <TEntity, object>(obj => obj.GetType().GetProperty(state.SortField)?.GetValue(obj, null)?.ToString() ?? string.Empty);

            return((state.IsOrderByDesc)
            ? items.OrderByDescending(func).AsEnumerable()
            : items.OrderBy(func).AsEnumerable());
        }
        public static IEnumerable <TEntity> ExtWhere <TEntity>(this IEnumerable <TEntity> items, PaginationState state) where TEntity : ExtEntity
        {
            var func = new Func <TEntity, bool>((obj) =>
            {
                var type = obj.GetType();
                if (!state.IsSearchTextEmpty())
                {
                    var st = state.SearchText.ToLower().Trim();
                    if (state.IsFilterFieldEmpty())
                    {
                        var sb = new StringBuilder();
                        type.GetProperties().ToList().ForEach(p =>
                        {
                            var val = p.GetValue(obj, null)?.ToString() ?? string.Empty;
                            sb.Append(val.ToLower().Trim()).Append(' ');
                        });
                        return(sb.ToString().Contains(st));
                    }
                    else
                    {
                        var ffVal = type.GetProperty(state.FilterField).GetValue(obj, null)?.ToString() ?? string.Empty;
                        return(ffVal.ToLower().Trim().Contains(st));
                    }
                }
                return(true);
            });

            return(items.Where(func).ExtOrder(state));
        }