Beispiel #1
0
        private FilterDefinition <BsonDocument> Convert(Filter Filter, ObjectSerializer Serializer)
        {
            if (Filter is FilterChildren FilterChildren)
            {
                Filter[] ChildFilters = FilterChildren.ChildFilters;
                int      i, c = ChildFilters.Length;
                FilterDefinition <BsonDocument>[] Children = new FilterDefinition <BsonDocument> [c];

                for (i = 0; i < c; i++)
                {
                    Children[i] = this.Convert(ChildFilters[i], Serializer);
                }

                if (Filter is FilterAnd)
                {
                    return(Builders <BsonDocument> .Filter.And(Children));
                }
                else if (Filter is FilterOr)
                {
                    return(Builders <BsonDocument> .Filter.Or(Children));
                }
                else
                {
                    throw this.UnknownFilterType(Filter);
                }
            }
            else if (Filter is FilterChild FilterChild)
            {
                FilterDefinition <BsonDocument> Child = this.Convert(FilterChild.ChildFilter, Serializer);

                if (Filter is FilterNot)
                {
                    return(Builders <BsonDocument> .Filter.Not(Child));
                }
                else
                {
                    throw this.UnknownFilterType(Filter);
                }
            }
            else if (Filter is FilterFieldValue FilterFieldValue)
            {
                object Value          = FilterFieldValue.Value;
                string FieldName      = Serializer.ToShortName(FilterFieldValue.FieldName, ref Value);
                bool   IsDefaultValue = Serializer.IsDefaultValue(FilterFieldValue.FieldName, Value);

                if (Filter is FilterFieldEqualTo)
                {
                    if (IsDefaultValue)
                    {
                        return(Builders <BsonDocument> .Filter.Eq <string>(FieldName, null));
                    }
                    else if (Value is string)
                    {
                        return(Builders <BsonDocument> .Filter.Eq <string>(FieldName, (string)Value));
                    }
                    else if (Value is int)
                    {
                        return(Builders <BsonDocument> .Filter.Eq <int>(FieldName, (int)Value));
                    }
                    else if (Value is long)
                    {
                        return(Builders <BsonDocument> .Filter.Eq <long>(FieldName, (long)Value));
                    }
                    else if (Value is double)
                    {
                        return(Builders <BsonDocument> .Filter.Eq <double>(FieldName, (double)Value));
                    }
                    else if (Value is bool)
                    {
                        return(Builders <BsonDocument> .Filter.Eq <bool>(FieldName, (bool)Value));
                    }
                    else if (Value is DateTime)
                    {
                        return(Builders <BsonDocument> .Filter.Eq <DateTime>(FieldName, (DateTime)Value));
                    }
                    else if (Value is ObjectId)
                    {
                        return(Builders <BsonDocument> .Filter.Eq <ObjectId>(FieldName, (ObjectId)Value));
                    }
                    else
                    {
                        throw this.UnhandledFilterValueDataType(Serializer.ValueType.FullName, FieldName, Value);
                    }
                }
                else if (Filter is FilterFieldNotEqualTo)
                {
                    if (IsDefaultValue)
                    {
                        return(Builders <BsonDocument> .Filter.Ne <string>(FieldName, null));
                    }
                    else if (Value is string)
                    {
                        return(Builders <BsonDocument> .Filter.Ne <string>(FieldName, (string)Value));
                    }
                    else if (Value is int)
                    {
                        return(Builders <BsonDocument> .Filter.Ne <int>(FieldName, (int)Value));
                    }
                    else if (Value is long)
                    {
                        return(Builders <BsonDocument> .Filter.Ne <long>(FieldName, (long)Value));
                    }
                    else if (Value is double)
                    {
                        return(Builders <BsonDocument> .Filter.Ne <double>(FieldName, (double)Value));
                    }
                    else if (Value is bool)
                    {
                        return(Builders <BsonDocument> .Filter.Ne <bool>(FieldName, (bool)Value));
                    }
                    else if (Value is DateTime)
                    {
                        return(Builders <BsonDocument> .Filter.Ne <DateTime>(FieldName, (DateTime)Value));
                    }
                    else if (Value is ObjectId)
                    {
                        return(Builders <BsonDocument> .Filter.Ne <ObjectId>(FieldName, (ObjectId)Value));
                    }
                    else
                    {
                        throw this.UnhandledFilterValueDataType(Serializer.ValueType.FullName, FieldName, Value);
                    }
                }
                else if (Filter is FilterFieldGreaterThan)
                {
                    if (Value is string)
                    {
                        return(Builders <BsonDocument> .Filter.Gt <string>(FieldName, (string)Value));
                    }
                    else if (Value is int)
                    {
                        return(Builders <BsonDocument> .Filter.Gt <int>(FieldName, (int)Value));
                    }
                    else if (Value is long)
                    {
                        return(Builders <BsonDocument> .Filter.Gt <long>(FieldName, (long)Value));
                    }
                    else if (Value is double)
                    {
                        return(Builders <BsonDocument> .Filter.Gt <double>(FieldName, (double)Value));
                    }
                    else if (Value is bool)
                    {
                        return(Builders <BsonDocument> .Filter.Gt <bool>(FieldName, (bool)Value));
                    }
                    else if (Value is DateTime)
                    {
                        return(Builders <BsonDocument> .Filter.Gt <DateTime>(FieldName, (DateTime)Value));
                    }
                    else if (Value is ObjectId)
                    {
                        return(Builders <BsonDocument> .Filter.Gt <ObjectId>(FieldName, (ObjectId)Value));
                    }
                    else
                    {
                        throw this.UnhandledFilterValueDataType(Serializer.ValueType.FullName, FieldName, Value);
                    }
                }
                else if (Filter is FilterFieldGreaterOrEqualTo)
                {
                    if (IsDefaultValue)
                    {
                        return(this.Convert(new FilterOr(new FilterFieldGreaterThan(FieldName, Value),
                                                         new FilterFieldEqualTo(FieldName, Value)), Serializer));
                    }
                    else if (Value is string)
                    {
                        return(Builders <BsonDocument> .Filter.Gte <string>(FieldName, (string)Value));
                    }
                    else if (Value is int)
                    {
                        return(Builders <BsonDocument> .Filter.Gte <int>(FieldName, (int)Value));
                    }
                    else if (Value is long)
                    {
                        return(Builders <BsonDocument> .Filter.Gte <long>(FieldName, (long)Value));
                    }
                    else if (Value is double)
                    {
                        return(Builders <BsonDocument> .Filter.Gte <double>(FieldName, (double)Value));
                    }
                    else if (Value is bool)
                    {
                        return(Builders <BsonDocument> .Filter.Gte <bool>(FieldName, (bool)Value));
                    }
                    else if (Value is DateTime)
                    {
                        return(Builders <BsonDocument> .Filter.Gte <DateTime>(FieldName, (DateTime)Value));
                    }
                    else if (Value is ObjectId)
                    {
                        return(Builders <BsonDocument> .Filter.Gte <ObjectId>(FieldName, (ObjectId)Value));
                    }
                    else
                    {
                        throw this.UnhandledFilterValueDataType(Serializer.ValueType.FullName, FieldName, Value);
                    }
                }
                else if (Filter is FilterFieldLesserThan)
                {
                    if (Value is string)
                    {
                        return(Builders <BsonDocument> .Filter.Lt <string>(FieldName, (string)Value));
                    }
                    else if (Value is int)
                    {
                        return(Builders <BsonDocument> .Filter.Lt <int>(FieldName, (int)Value));
                    }
                    else if (Value is long)
                    {
                        return(Builders <BsonDocument> .Filter.Lt <long>(FieldName, (long)Value));
                    }
                    else if (Value is double)
                    {
                        return(Builders <BsonDocument> .Filter.Lt <double>(FieldName, (double)Value));
                    }
                    else if (Value is bool)
                    {
                        return(Builders <BsonDocument> .Filter.Lt <bool>(FieldName, (bool)Value));
                    }
                    else if (Value is DateTime)
                    {
                        return(Builders <BsonDocument> .Filter.Lt <DateTime>(FieldName, (DateTime)Value));
                    }
                    else if (Value is ObjectId)
                    {
                        return(Builders <BsonDocument> .Filter.Lt <ObjectId>(FieldName, (ObjectId)Value));
                    }
                    else
                    {
                        throw this.UnhandledFilterValueDataType(Serializer.ValueType.FullName, FieldName, Value);
                    }
                }
                else if (Filter is FilterFieldLesserOrEqualTo)
                {
                    if (IsDefaultValue)
                    {
                        return(this.Convert(new FilterOr(new FilterFieldLesserThan(FieldName, Value),
                                                         new FilterFieldEqualTo(FieldName, Value)), Serializer));
                    }
                    else if (Value is string)
                    {
                        return(Builders <BsonDocument> .Filter.Lte <string>(FieldName, (string)Value));
                    }
                    else if (Value is int)
                    {
                        return(Builders <BsonDocument> .Filter.Lte <int>(FieldName, (int)Value));
                    }
                    else if (Value is long)
                    {
                        return(Builders <BsonDocument> .Filter.Lte <long>(FieldName, (long)Value));
                    }
                    else if (Value is double)
                    {
                        return(Builders <BsonDocument> .Filter.Lte <double>(FieldName, (double)Value));
                    }
                    else if (Value is bool)
                    {
                        return(Builders <BsonDocument> .Filter.Lte <bool>(FieldName, (bool)Value));
                    }
                    else if (Value is DateTime)
                    {
                        return(Builders <BsonDocument> .Filter.Lte <DateTime>(FieldName, (DateTime)Value));
                    }
                    else if (Value is ObjectId)
                    {
                        return(Builders <BsonDocument> .Filter.Lte <ObjectId>(FieldName, (ObjectId)Value));
                    }
                    else
                    {
                        throw this.UnhandledFilterValueDataType(Serializer.ValueType.FullName, FieldName, Value);
                    }
                }
                else
                {
                    throw this.UnknownFilterType(Filter);
                }
            }
            else
            {
                if (Filter is FilterFieldLikeRegEx FilterFieldLikeRegEx)
                {
                    return(Builders <BsonDocument> .Filter.Regex(Serializer.ToShortName(FilterFieldLikeRegEx.FieldName),
                                                                 FilterFieldLikeRegEx.RegularExpression));
                }
                else
                {
                    throw this.UnknownFilterType(Filter);
                }
            }
        }