public ISqlFragment Parse(IFieldMapping mapping, ISerializer serializer, MethodCallExpression expression)
        {
            var field   = GetField(mapping, expression);
            var locator = field.TypedLocator;

            ConstantExpression value;

            if (expression.Object?.NodeType == ExpressionType.Constant)
            {
                value = (ConstantExpression)expression.Object;
            }
            else
            {
                value = expression.Arguments.OfType <ConstantExpression>().FirstOrDefault();
            }
            if (value == null)
            {
                throw new BadLinqExpressionException("Could not extract value from {0}.".ToFormat(expression), null);
            }

            object valueToQuery = value.Value;

            if (valueToQuery == null)
            {
                return(new WhereFragment($"({field.RawLocator}) {_isOperator} null"));
            }

            if (valueToQuery.GetType() != expression.Method.DeclaringType)
            {
                try
                {
                    valueToQuery = Convert.ChangeType(value.Value, expression.Method.DeclaringType);
                }
                catch (Exception e)
                {
                    throw new BadLinqExpressionException(
                              $"Could not convert {value.Value.GetType().FullName} to {expression.Method.DeclaringType}", e);
                }
            }

            if (_supportContainment && ((mapping.PropertySearching == PropertySearching.ContainmentOperator ||
                                         field.ShouldUseContainmentOperator())))
            {
                var dict = new Dictionary <string, object>();
                ContainmentWhereFragment.CreateDictionaryForSearch(dict, expression, valueToQuery, serializer);
                return(new ContainmentWhereFragment(serializer, dict));
            }

            return(new WhereFragment($"{locator} {_equalsOperator} ?", valueToQuery));
        }
Exemple #2
0
        public IWhereFragment Parse(IQueryableDocument mapping, ISerializer serializer, MethodCallExpression expression)
        {
            var value = expression.Arguments.Single().Value();

            return(ContainmentWhereFragment.SimpleArrayContains(FindMembers.Determine(expression.Object), serializer, expression.Object, value));
        }