如何使用 MongoDB C# Driver v2 构建查询

本文关键字:v2 构建 查询 Driver 何使用 MongoDB | 更新日期: 2023-09-27 18:31:34

我正在尝试通过多个步骤构建查询,但看起来流畅的接口(在IQueryable上定义的LINQ方法)在新版本的C#驱动程序中消失了。

//get the collection
IMongoCollection<WorkerSession> workerSessions = Select<WorkerSession>();
if (query.IsOngoing.HasValue)
{
    IFindFluent<WorkerSession, WorkerSession> items = query.IsOngoing.Value 
                        ? workerSessions.Find(session => session.CompletedOn == null)
                        : workerSessions.Find(session => session.CompletedOn != null);
}

我想继续添加过滤器,但IFindFluent接口似乎不支持这一点。根据参数,我什至可能没有过滤器。如何分多个步骤构建查询?

如何使用 MongoDB C# Driver v2 构建查询

看起来有一个用于构建过滤器的类。您应该在构造完整过滤器时调用一次 Find 方法。

var filterBuilder = new FilterDefinitionBuilder<WorkerSession>();
var filter = filterBuilder.Empty;
if (query.IsOngoing.HasValue)
{
    filter = filterBuilder.And(query.IsOngoing.Value
        ? new ExpressionFilterDefinition<WorkerSession>(session => session.CompletedOn == null)
        : new ExpressionFilterDefinition<WorkerSession>(session => session.CompletedOn != null));
}
var filtered = await workerSessions.Find(filter).ToListAsync();
使用

Slazure的Linq提供程序进行MongoDB查询过滤使您的方案变得简单得多。下面是一个 Slazure 示例,其中为年龄小于 22 岁且已注册新闻稿的所有客户查询虚构的"TestCustomers"集合,最后将客户文档的电子邮件属性写入控制台:

using SysSurge.Slazure.AzureDocumentDB.Linq;
using SysSurge.Slazure.Core;
using SysSurge.Slazure.Core.Linq.QueryParser;
public void ShowYoungCustomerWithNewsletterEmails()
{
    // Get a reference to the collection
    dynamic storage = new QueryableStorage<DynDocument>("URL=https://contoso.documents.azure.com:443/;DBID=DDBExample;TOKEN=VZ+qKPAkl9TtX==");
    QueryableCollection<DynDocument> collection = storage.TestCustomers;
    // Build collection query
    var queryResult = collection.Where("SignedUpForNewsletter = true and Age < 22");
    foreach (var document in queryResult)
    {
        Console.WriteLine(document.email);
    }
}

您可以使用 IMongoCollection 获取您的集合,然后使用 AsQueryable

例:

    var query = collection.AsQueryable();
    if (!string.IsNullOrEmpty(entity.Name))
        query = query.Where(p => p.Name.Contains(entity.Name));
    if (!string.IsNullOrEmpty(entity.Description))
        query = query.Where(p => p.Description.Contains(entity.Description));
    var YourList=query.ToList();