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