繁体   English   中英

Mongo C#驱动程序:如何使用本机API编写复杂的查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM