Ejemplo n.º 1
0
 public ContentSerializer(Type type, MongoDatabaseProvider database, IProxyFactory proxies)
 {
     this.database = database;
     classMap      = BsonClassMap.LookupClassMap(type);
     serializer    = new BsonClassMapSerializer(classMap);
     this.proxies  = proxies;
 }
Ejemplo n.º 2
0
        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);
        }