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