Exemple #1
0
        private static AstFilterField TranslateWithIntIndex(TranslationContext context, MethodCallExpression expression, MethodInfo method, Expression fieldExpression, int index)
        {
            var field = ExpressionToFilterFieldTranslator.TranslateEnumerable(context, fieldExpression);

            if (field.Serializer is IBsonArraySerializer arraySerializer &&
                arraySerializer.TryGetItemSerializationInfo(out var itemSerializationInfo))
            {
                var itemSerializer = itemSerializationInfo.Serializer;
                if (method.ReturnType.IsAssignableFrom(itemSerializer.ValueType))
                {
                    return(field.SubField(index.ToString(), itemSerializer));
                }
            }

            throw new ExpressionNotSupportedException(expression);
        }
        public static AstFilterField Translate(TranslationContext context, MethodCallExpression expression)
        {
            var method    = expression.Method;
            var arguments = expression.Arguments;

            if (method.IsStatic &&
                method.Name == "First" &&
                arguments.Count == 1)
            {
                var enumerableFieldAst = ExpressionToFilterFieldTranslator.TranslateEnumerable(context, arguments[0]);
                if (enumerableFieldAst.Serializer is IBsonArraySerializer arraySerializer &&
                    arraySerializer.TryGetItemSerializationInfo(out var itemSerializationInfo))
                {
                    var itemSerializer = itemSerializationInfo.Serializer;
                    if (method.ReturnType.IsAssignableFrom(itemSerializer.ValueType))
                    {
                        return(enumerableFieldAst.SubField("0", itemSerializer));
                    }
                }
            }

            throw new ExpressionNotSupportedException(expression);
        }