Category Archives: Свой код
Mongo и C#: агрегация, pipeline
Очень старый кусок кода (~2012-13 гг.), но вдруг пригодится когда-нибудь, память освежить.
var match = new BsonDocument { { "$match", new BsonDocument { { "Date", new BsonDocument { { "$lte", DateTime.Now } } } } } }; var group = new BsonDocument { { "$group", new BsonDocument { { "_id","$Blog._id" }, { "PublishDate", new BsonDocument { { "$max", "$Date" } } } } } }; var project = new BsonDocument { { "$project", new BsonDocument { { "Blog._id", "$_id" }, { "PublishDate", "$PublishDate" } } } }; var sort = new BsonDocument { { "$sort", new BsonDocument { { "PublishDate", -1 } } } }; var skip = new BsonDocument { { "$skip", (page - 1) * count } }; var limit = new BsonDocument { { "$limit", count } }; var pipeline = new[] { match, group, sort, project, skip, limit }; var lastPostsInBlogs = this.mongoContext.Posts .Aggregate(pipeline) .ResultDocuments.Select(x => BsonSerializer.Deserialize(x)) .ToList(); return lastPostsInBlogs.Join( this.mongoContext.Blogs.AsQueryable() .Where(condition), pb => pb.Blog.Id, b => b.Id, (pb, b) => new BlogItem() { Id = b.StrId, Alias = b.Alias, Title = b.Title, Description = b.Info, CoverFile = b.CoverFile ?? DomainAppSettings.DefaultPreview, CanPost = b.Owner.AccountId == visitorId || (b.IsCommon && b.Members.Contains(visitorId)), LastUpdated = b.LastUpdated, LastPosts = this.mongoContext.Posts .AsQueryable() .Where(p => p.Blog.Id == b.Id && p.PublishDate p.PublishDate) .Take(3) .Select(p => new PostLine() { Id = p.StrId, Number = p.Number, BlogAlias = p.Blog.Alias, Title = p.Title, Date = p.Date }) }).ToArray();
EF и Generic
Оставляю кусочек кода себе на память. Универсальный, но в моем случае требует костылей.
#region Generic public void CreateLang(TModel langModel, out IEnumerable diff) { Type entityType = this.TypesModelEntity[typeof(TModel)]; //вот костыль var langType = this.TypesEntityLang[entityType]; //и еще один Type genericClass = typeof(EFLangRepository); Type constructedClass = genericClass.MakeGenericType(typeof(TModel), entityType, langType); object repo = Activator.CreateInstance(constructedClass); diff = new List(); object[] args = new object[] { langModel, diff }; MethodInfo magicMethod = constructedClass.GetMethod("CreateLang"); object magicValue = magicMethod.Invoke(repo, args); diff = args[1] as List; } #endregion
Календарик
Под катом полная версия на 2013 год и код генератора на любой год.
C#-MongoDB Polymorphic Classes
Появилась задача хранить документы с разной структурой в одной коллекции.
Вопрос на СО
http://stackoverflow.com/questions/13956413/mongodb-embedded-polymorphic-objects
Документация
http://docs.mongodb.org/ecosystem/tutorial/serialize-documents-with-the-csharp-driver/#polymorphic-classes-and-discriminators
Мои примеры.
Continue Reading →