public ActionResult Index(DataFilterModel dataFilter)
        {
            if (dataFilter.DateStart == DateTime.MinValue || dataFilter.DateStart == null)
            {
                dataFilter.DateStart = DateTime.Now.AddDays(-5);
            }
            if (dataFilter.DateEnd == DateTime.MinValue || dataFilter.DateEnd == null)
            {
                dataFilter.DateEnd = DateTime.Now;
            }
            DateTime dt1     = (DateTime)dataFilter.DateStart;
            DateTime dt2     = (DateTime)dataFilter.DateEnd;
            var      glasses = _repo.GetGlassesWithOrder()
                               .Where(g => g.TimeStamp >= dt1 && g.TimeStamp <= dt2)
                               .OrderBy(g => g.TimeStamp);

            glassesViewModel.Glasses.Clear();
            foreach (var item in glasses)
            {
                glassesViewModel.Glasses.Add(item);
            }
            glassesViewModel.DataFilter.DateStart = dt1;
            glassesViewModel.DataFilter.DateEnd   = dt2;
            glassesViewModel.DataFilter.Count     = glassesViewModel.Glasses.Count();
            return(View(glassesViewModel));
        }
        public static List <T> ApplyFilter <T>(this DataFilterModel dataFilter, IEnumerable <T> items)
            where T : ITransaction
        {
            //var filters = dataFilter.BuildFilters();
            //var filterExpression = dataFilter.BuildFilter<T>();
            //return items.AsQueryable().Where(filterExpression).ToList();
            return(!dataFilter.IsFilterApplied
                ? items.ToList()
                : items.Where(t =>
                              (string.IsNullOrEmpty(dataFilter.Description) || (!string.IsNullOrEmpty(t.Description) &&
                                                                                t.Description.ToLower().Contains(dataFilter.Description.ToLower())))

                              && (string.IsNullOrEmpty(dataFilter.Remark) || (!string.IsNullOrEmpty(t.Remark) && t.Remark.ToLower().Contains(dataFilter.Remark.ToLower())))

                              && (dataFilter.TransactionType == null || t.TransactionType == dataFilter.TransactionType.Value)

                              && (dataFilter.AllCategories || ((dataFilter.IncludeWithoutCategory && t.TransactionCategory == null) ||
                                                               (t.TransactionCategory != null && dataFilter.CategoryIds.Contains(t.TransactionCategory.Id))))

                              && (dataFilter.StorageIds.Count == 0 || t.TransactionStorageIds.Any(x => dataFilter.StorageIds.Contains(x))))
                   .ToList());
        }
        public static Func <T, bool> BuildFilter <T>(this DataFilterModel dataFilter)
            where T : ITransaction
        {
            var filterExpressions = new List <Expression <Func <T, bool> > >();

            if (dataFilter.IsFilterApplied)
            {
                if (!string.IsNullOrEmpty(dataFilter.Description))
                {
                    filterExpressions.Add((t) => !string.IsNullOrEmpty(t.Description) &&
                                          t.Description.ToLower().Contains(dataFilter.Description.ToLower()));
                }

                if (!string.IsNullOrEmpty(dataFilter.Remark))
                {
                    filterExpressions.Add((t) => !string.IsNullOrEmpty(t.Remark) && t.Remark.ToLower().Contains(dataFilter.Remark.ToLower()));
                }

                if (dataFilter.TransactionType.HasValue)
                {
                    filterExpressions.Add((t) => t.TransactionType == dataFilter.TransactionType.Value);
                }

                if (dataFilter.CategoryIds.Count > 0)
                {
                    filterExpressions.Add((t) => (dataFilter.IncludeWithoutCategory && t.TransactionCategory == null) ||
                                          (t.TransactionCategory != null && dataFilter.CategoryIds.Contains(t.TransactionCategory.Id)));
                }

                if (dataFilter.StorageIds.Count > 0)
                {
                    filterExpressions.Add((t) => t.TransactionStorageIds.Any(x => dataFilter.StorageIds.Contains(x)));
                }
            }

            return((filterExpressions.Count == 0 ? (T t) => true : filterExpressions.Combine()).Compile());
        }
        public static List <Func <ITransaction, bool> > BuildFilters(this DataFilterModel dataFilter)
        {
            var filters = new List <Func <ITransaction, bool> >();

            if (dataFilter.IsFilterApplied)
            {
                if (!string.IsNullOrEmpty(dataFilter.Description))
                {
                    filters.Add((t) => !string.IsNullOrEmpty(t.Description) &&
                                t.Description.ToLower().Contains(dataFilter.Description.ToLower()));
                }

                if (!string.IsNullOrEmpty(dataFilter.Remark))
                {
                    filters.Add((t) => !string.IsNullOrEmpty(t.Remark) && t.Remark.Contains(dataFilter.Remark));
                }

                if (dataFilter.TransactionType.HasValue)
                {
                    filters.Add((t) => t.TransactionType == dataFilter.TransactionType.Value);
                }

                if (dataFilter.CategoryIds.Count > 0)
                {
                    filters.Add((t) => (dataFilter.IncludeWithoutCategory && t.TransactionCategory == null) ||
                                (t.TransactionCategory != null && dataFilter.CategoryIds.Contains(t.TransactionCategory.Id)));
                }

                if (dataFilter.StorageIds.Count > 0)
                {
                    filters.Add((t) => t.TransactionStorageIds.Any(x => dataFilter.StorageIds.Contains(x)));
                }
            }

            return(filters);
        }