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()); }