示例#1
0
        private static BaseExpression ConvertToBaseExpression(ExpressionMetadata filterMetadataLeftExpression)
        {
            var dataValueType = DataValueTypeUtilities.ConvertTypeToDataValueType(filterMetadataLeftExpression.Parameter.Type);
            var value         = GetQueryValue(filterMetadataLeftExpression.Parameter.Value, dataValueType);

            return(ConvertToBaseExpression(dataValueType, value));
        }
示例#2
0
        Expression Visit(
            Expression node,
            ExpressionMetadata parentMeta)
        {
            if (node == null)
            {
                throw new ArgumentNullException(nameof(node));
            }

            _metadata.TryGetValue(node.NodeType, out var meta);

            if (meta.Weight > parentMeta.Weight ||
                meta.Weight == parentMeta.Weight && meta.LeftAssociative == parentMeta.LeftAssociative)
            {
                Visit(node);
            }
            else
            {
                _writer.Write('(');
                Visit(node);
                _writer.Write(')');
            }

            return(node);
        }
示例#3
0
 private static ColumnExpression ConvertToColumnExpression(ExpressionMetadata filterMetadataLeftExpression)
 {
     return(new ColumnExpression()
     {
         ExpressionType = EntitySchemaQueryExpressionType.SchemaColumn,
         ColumnPath = filterMetadataLeftExpression.Parameter.ColumnPath
     });
 }
示例#4
0
 private static Filter GenerateSingleColumnFilter(ExpressionMetadata filterMetadata)
 {
     if (filterMetadata.Parameter?.Type == typeof(bool))
     {
         return(GenerateBooleanSingleColumnFilter(filterMetadata));
     }
     throw new NotImplementedException();
 }
示例#5
0
        protected override Expression VisitTypeBinary(
            TypeBinaryExpression node)
        {
            ExpressionMetadata meta = _metadata[node.NodeType];

            Visit(node.Expression, node);
            _writer.Write("{0}{1}", meta.Operator, GetTypeName(node.TypeOperand));
            return(node);
        }
示例#6
0
        private static Filter GenerateBooleanSingleColumnFilter(ExpressionMetadata filterMetadata)
        {
            var left  = ConvertExpression(filterMetadata);
            var right = ConvertToBaseExpression(DataValueType.Boolean, true);

            return(new Filter()
            {
                FilterType = FilterType.CompareFilter,
                LeftExpression = left,
                ComparisonType = FilterComparisonType.Equal,
                RightExpression = right
            });
        }
示例#7
0
        private static T GenerateFilterGroup <T>(ExpressionMetadata filterMetadata) where T : Filter, new()
        {
            var filters = new Dictionary <string, Filter>();

            filterMetadata.Items.ForEach(fm => {
                filters.Add(Guid.NewGuid().ToString(), GenerateFilter(fm));
            });
            return(new T()
            {
                FilterType = FilterType.FilterGroup,
                LogicalOperation = filterMetadata.LogicalOperation,
                Items = filters
            });
        }
示例#8
0
        internal static Filter GenerateFilter(ExpressionMetadata filterMetadata)
        {
            switch (filterMetadata.NodeType)
            {
            case ExpressionMetadataNodeType.Comparison:
                return(GenerateComparisonFilter(filterMetadata));

            case ExpressionMetadataNodeType.Group:
                return(GenerateFilterGroup <Filter>(filterMetadata));

            case ExpressionMetadataNodeType.Column:
                return(GenerateSingleColumnFilter(filterMetadata));

            default:
                throw new NotImplementedException();
            }
        }
示例#9
0
        private static Filter GenerateComparisonFilter(ExpressionMetadata filterMetadata)
        {
            var rightExpressions = filterMetadata.RightExpressions.Select(ConvertExpression).ToList();
            var filter           = new Filter()
            {
                FilterType       = rightExpressions.Count > 1 ? FilterType.InFilter : FilterType.CompareFilter,
                LeftExpression   = ConvertExpression(filterMetadata.LeftExpression),
                ComparisonType   = filterMetadata.ComparisonType,
                IsNull           = filterMetadata.ComparisonType == FilterComparisonType.IsNull,
                RightExpression  = rightExpressions.Count == 1 ? rightExpressions.First() : null,
                RightExpressions = rightExpressions.Count > 1 ? rightExpressions.ToArray() : null
            };

            if (filterMetadata.ComparisonType == FilterComparisonType.IsNull || filterMetadata.ComparisonType == FilterComparisonType.IsNotNull)
            {
                filter.FilterType = FilterType.IsNullFilter;
            }
            return(filter);
        }
示例#10
0
 private static BaseExpression ConvertExpression(ExpressionMetadata filterMetadataLeftExpression)
 {
     return(filterMetadataLeftExpression.NodeType == ExpressionMetadataNodeType.Column
                         ? ConvertToColumnExpression(filterMetadataLeftExpression)
                         : ConvertToBaseExpression(filterMetadataLeftExpression));
 }