public ContentSerializer(Type type, MongoDatabaseProvider database, IProxyFactory proxies) { this.database = database; classMap = BsonClassMap.LookupClassMap(type); serializer = new BsonClassMapSerializer(classMap); this.proxies = proxies; }
public static List <BsonDocument> ApplyLookup <TSource>(this IFindFluent <TSource, TSource> findFluent, FilterDefinition <TSource> filterDefinition) { var bsonClassMap = new BsonClassMap(typeof(TSource)); bsonClassMap.AutoMap(); bsonClassMap.Freeze(); var serializer = new BsonClassMapSerializer <TSource>(bsonClassMap); var bsonDocument = filterDefinition.Render(serializer, new BsonSerializerRegistry()); var propertyInfo = typeof(TSource).GetProperty("Lookup"); if (propertyInfo == null) { return(new List <BsonDocument>()); } var lookups = (Dictionary <string, EntityLookup>)propertyInfo.GetValue("Lookup"); var bsonDocuments = new List <BsonDocument>(); foreach (var lookup in lookups) { bsonDocuments.Add(new BsonDocument { { "$lookup", new BsonDocument { { "from", lookup.Value.From }, { "foreignField", lookup.Value.ForeignField }, { "localField", lookup.Value.LocalField }, { "as", lookup.Value.As } } } }); bsonDocuments.Add(new BsonDocument { { "$unwind", new BsonDocument { { "path", $"${lookup.Value.As}" }, { "preserveNullAndEmptyArrays", true } } } }); } bsonDocuments.Insert(0, new BsonDocument { { "$match", bsonDocument } }); return(bsonDocuments); }