public void Build(EntityFilter entityFilter)
 {
     _expression.Length = 0;
     _values.Clear();
     if (entityFilter == null)
     {
         return;
     }
     Visit(entityFilter);
 }
        private bool WriteGroup(EntityFilter entityFilter)
        {
            var hasGroup = entityFilter.Filters != null && entityFilter.Filters.Any();

            if (!hasGroup)
            {
                return(false);
            }

            if (!string.IsNullOrWhiteSpace(entityFilter.Name))
            {
                var logic = string.IsNullOrWhiteSpace(entityFilter.Logic)
                    ? EntityFilterLogic.And
                    : entityFilter.Logic;
                _expression.Append($" {logic} (");
            }
            else
            {
                _expression.Append("(");
            }

            foreach (var filter in entityFilter.Filters)
            {
                Visit(filter);

                var isLast = entityFilter.Filters.LastOrDefault() == filter;
                if (filter == null)
                {
                    continue;
                }
                var filterLogic = string.IsNullOrWhiteSpace(filter.Logic)
                    ? EntityFilterLogic.And
                    : filter.Logic;
                if (!isLast)
                {
                    _expression.Append($" {filterLogic} ");
                }
            }
            _expression.Append(")");
            return(true);
        }
        private void WriteExpression(EntityFilter entityFilter)
        {
            if (string.IsNullOrWhiteSpace(entityFilter.Name))
            {
                return;
            }
            var index = _values.Count;
            var name  = entityFilter.Name;
            var value = entityFilter.Value;
            var o     = string.IsNullOrWhiteSpace(entityFilter.Operator) ? "==" : entityFilter.Operator;

            _operatorMap.TryGetValue(o, out string comparison);
            if (string.IsNullOrEmpty(comparison))
            {
                comparison = o.Trim();
            }
            var negation = comparison.StartsWith("!") || comparison.StartsWith("not", StringComparison.OrdinalIgnoreCase) ? "!" : string.Empty;

            if (comparison.EndsWith(EntityFilterOperators.StartsWith, StringComparison.OrdinalIgnoreCase))
            {
                _expression.Append($"{negation}{name}.StartsWith(@{index})");
            }
            else if (comparison.EndsWith(EntityFilterOperators.EndsWith, StringComparison.OrdinalIgnoreCase))
            {
                _expression.Append($"{negation}{name}.EndsWith(@{index})");
            }
            else if (comparison.EndsWith(EntityFilterOperators.Contains, StringComparison.OrdinalIgnoreCase))
            {
                _expression.Append($"{negation}{name}.Contains(@{index})");
            }
            else
            {
                _expression.Append($"{name} {comparison} @{index}");
            }
            _values.Add(value);
        }
        private void Visit(EntityFilter entityFilter)
        {
            WriteExpression(entityFilter);

            WriteGroup(entityFilter);
        }
Exemplo n.º 5
0
 public EntityListQuery(EntityFilter filter)
 {
     Filter = filter;
 }