Exemple #1
0
        public static void CreateDictionaryForSearch(BinaryExpression binary, IDictionary <string, object> dict)
        {
            var expressionValue  = MartenExpressionParser.Value(binary.Right);
            var memberExpression = binary.Left;

            CreateDictionaryForSearch(dict, memberExpression, expressionValue);
        }
        public string ToSql(NpgsqlCommand command)
        {
            var wheres = _expression
                         .QueryModel
                         .BodyClauses
                         .OfType <WhereClause>()
                         .Select(x => x.Predicate)
                         .ToArray();

            if (!wheres.All(x => x is BinaryExpression))
            {
                throw new NotImplementedException();
            }


            var visitor = new FindMembers();

            visitor.Visit(_expression.QueryModel.MainFromClause.FromExpression);

            var members           = visitor.Members;
            var binaryExpressions = wheres.OfType <BinaryExpression>().ToArray();
            var dictionary        = new Dictionary <string, object>();

            // Are we querying directly againt the elements as you would for primitive types?
            if (binaryExpressions.All(x => x.Left is QuerySourceReferenceExpression && x.Right is ConstantExpression))
            {
                if (binaryExpressions.Any(x => x.NodeType != ExpressionType.Equal))
                {
                    throw new NotSupportedException("Only the equality operator is supported on Collection.Any(x => x) searches directly against the element");
                }

                var values = binaryExpressions.Select(x => MartenExpressionParser.Value(x.Right)).ToArray();
                if (members.Count == 1)
                {
                    dictionary.Add(members.Single().Name, values);
                }
                else
                {
                    throw new NotSupportedException();
                }
            }
            else
            {
                var search = new Dictionary <string, object>();
                binaryExpressions.Each(x => gatherSearch(x, search));


                if (members.Count == 1)
                {
                    dictionary.Add(members.Single().Name, new[] { search });
                }
                else
                {
                    throw new NotImplementedException();
                }
            }



            var json = _serializer.ToCleanJson(dictionary);

            return($"data @> '{json}'");
        }