如何使用 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接口似乎不支持这一点。根据参数,我什至可能没有过滤器。如何分多个步骤构建查询?
看起来有一个用于构建过滤器的类。您应该在构造完整过滤器时调用一次 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();