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
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 →
