[英]Mongo C# driver: how to compose complex queries using native API
使用C#中的Linq,可以编写如下代码:
public static class MyEntityExtensions {
public static IQueryable<MyEntity> ByCodeSystem(IQueryable<MyEntity> items, int codeSystemId) {
return items.Where(o => o.CodeSystemId == codeSystemId);
}
public static IQueryable<MyEntity> NotDeleted(IQueryable<MyEntity> items) {
return items.Where(o => !o.Deleted);
}
}
然后像这样使用它:
DbSet<MyEntity> allMyEntities = myDbContext.MyEntities;
var myFilteredEntities = allMyEntities
.ByCodeSystem(42)
.NotDeleted()
.Select(e => new { Id = e.Id, Name: e.Name })
.ToArray(); // Materialize only the filtered ones and project only the needed data
查询MongoDb及其本机API时如何做到这一点? 我知道通过使用IMongoCollection.AsQueryable()可以完全像这样使用集合,但是某些mongo运算符可以通过本机API更直接地映射(即:Builders.Filter。,Builders.Sort。ecc)。
您可以对扩展方法进行同样的操作以扩展mongo过滤器生成器,对于您的linq示例,我们可以:
public static class MyModelFilterDefinitionBuilderExtentions
{
public static FilterDefinition<MyModel> IsNotDeleted(this FilterDefinitionBuilder<MyModel> filter)
{
return filter.Eq(x => x.Deleted, false);
}
public static FilterDefinition<MyModel> ByCodeSystem(this FilterDefinitionBuilder<MyModel> filter, int codeSystemId)
{
return filter.Eq(x => x.CodeSystemId, codeSystemId);
}
}
然后我们可以使用
mongoCollection.Find(Builders<MyModel>.Filter.IsNotDeleted());
或套用多个
var filter = Builders<MyModel>.Filter.IsNotDeleted() & Builders<MyModel>.Filter.ByCodeSystem(10);
mongoCollection.Find(filter);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.