private IQueryable <T> ApplyWhere(IQueryable <T> queryable)
        {
            var predicates = new List <string>();
            var values     = new List <object>();

            var counter = new PlaceHolderCounter();

            foreach (var queryArgumentInfo in _list.FilterBy(QueryArgumentInfoType.GraphQL))
            {
                foreach (var argument in _arguments)
                {
                    if (string.Equals(argument.Key, queryArgumentInfo.QueryArgument?.Name, StringComparison.OrdinalIgnoreCase))
                    {
                        var predicate = BuildPredicate(queryArgumentInfo, argument.Value, counter);
                        if (predicate != null)
                        {
                            predicates.Add(predicate.Value.Text);
                            values.AddRange(predicate.Value.Values);
                        }
                    }
                }
            }

            return(predicates.Any() ? queryable.Where(string.Join($" {Operators.And} ", predicates), values.ToArray()) : queryable);
        }
        private (string Text, object[] Values)? BuildPredicate(QueryArgumentInfo info, object value, PlaceHolderCounter counter)
        {
            if (info.EntityPath == null)
            {
                return(null);
            }

            var values     = new List <object>();
            var predicates = new List <(string @operator, string placeHolder)>();

            if (info.QueryArgument?.Type == typeof(DateGraphType) && value is DateTime date)
            {
                predicates.Add((Operators.GreaterThanEqual, $"@{counter.GetNew()}"));
                predicates.Add((Operators.LessThan, $"@{counter.GetNew()}"));

                values.Add(date);
                values.Add(date.AddDays(1));
            }
            else
            {
                predicates.Add((Operators.Equal, $"@{counter.GetNew()}"));
                values.Add(value);
            }

            var text = string.Join($" {Operators.And} ", predicates.Select(p =>
            {
                if (!info.ParentGraphType.IsListGraphType())
                {
                    string path = string.Join(".", info.EntityPath);
                    string wrap = info.IsNonNullGraphType ? path : $"np({path})";
                    return($"({wrap} {p.@operator} {p.placeHolder})");
                }

                var theRest = string.Join(".", info.EntityPath.Skip(1));
                return($"({info.EntityPath[0]} != null ? {info.EntityPath[0]}.Any({theRest} {p.@operator} {p.placeHolder}) : false)");
            }));

            return(text, values.ToArray());
        }