private static IQueryable <T> Filter <T>(this IQueryable <T> queryable, GetRowsParams getRowsParams)
        {
            foreach (var kvp in getRowsParams.FilterModel)
            {
                var colId       = kvp.Key;
                var filterModel = kvp.Value;

                if (string.IsNullOrEmpty(filterModel.Operator))
                {
                    var predicate = GetPredicate(colId, filterModel, 0);
                    var args      = GetWhereArgs(filterModel);

                    queryable = queryable.Where(predicate, args: args);
                }
                else
                {
                    var predicateLeftSide = GetPredicate(colId, filterModel.Condition1, 0);
                    var argsLeftSide      = GetWhereArgs(filterModel.Condition1);

                    var rightSideArgsIndex = filterModel.Condition1.Type == FilterModelType.InRange ? 2 : 1;

                    var predicateRightSide = GetPredicate(colId, filterModel.Condition2, rightSideArgsIndex);
                    var argsRightSide      = GetWhereArgs(filterModel.Condition2);

                    var predicate = $"{predicateLeftSide} {filterModel.Operator} {predicateRightSide}";
                    var args      = argsLeftSide.Concat(argsRightSide).ToArray();

                    queryable = queryable.Where(predicate, args: args);
                }
            }

            return(queryable);
        }
        public static InfiniteRowModelResult <T> GetInfiniteRowModelBlock <T>(this IQueryable <T> queryable, GetRowsParams getRowsParams)
        {
            var takeCount = getRowsParams.EndRow - getRowsParams.StartRow;

            var rows = queryable
                       .Filter(getRowsParams)
                       .Sort(getRowsParams)
                       .Skip(getRowsParams.StartRow)
                       .Take(takeCount + 1)
                       .ToList();

            var reachedEnd = rows.Count <= takeCount;

            return(new InfiniteRowModelResult <T>
            {
                RowsThisBlock = rows.Take(takeCount).ToList(),
                LastRow = reachedEnd ? getRowsParams.StartRow + rows.Count : null
            });
        }