【问题标题】:How to build a query with MongoDB C# Driver v2?如何使用 MongoDB C# Driver v2 构建查询?
【发布时间】:2016-01-22 19:22:53
【问题描述】:

我正在尝试分多个步骤构建查询,但新版本的 C# 驱动程序中似乎没有流畅的接口(在 IQueryable 上定义的 LINQ 方法)。

//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 界面似乎不支持。根据参数,我什至可能没有过滤器。如何分多个步骤构建查询?

【问题讨论】:

  • @JohnnyHK 我正在使用 v2.2.0

标签: c# mongodb linq


【解决方案1】:

看起来有一个用于构建过滤器的类。您应该在构建完整过滤器时调用一次 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();

【讨论】:

  • 如果您知道另一种方法,请发布您的答案。
【解决方案2】:

使用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);
    }
}

【讨论】:

    【解决方案3】:

    您可以使用 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多