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}'"); }