Mongo C#driver - 使用嵌套动态构建过滤器

Mr7*_*267 16 c# mongodb

假设类似于嵌套表达式

其中a = 1 AND(b = 4 OR b = 5)

如何使用多个Builders对象并从这样的表达式构建一个完整的过滤器?

rno*_*nko 61

Builders是非常灵活的类,它还覆盖了运算符" & = AND"和" | = OR"

你的榜样将是

var filter = Builders<User>.Filter.Eq(x => x.A, "1");
filter = filter & (Builders<User>.Filter.Eq(x => x.B, "4") | Builders<User>.Filter.Eq(x => x.B, "5"));
Run Code Online (Sandbox Code Playgroud)


小智 23

如果您想有条件地添加更多过滤器,请使用此方法:

var builder = Builders<Student>.Filter;
var filter = builder.Empty;

if (!string.IsNullOrWhiteSpace(firstName))
{
   var firstNameFilter = builder.Eq(x => x.FirstName, firstName);
   filter &= firstNameFilter;
}

if (!string.IsNullOrWhiteSpace(lastName))
{
   var lastNameFilter = builder.Eq(x => x.LastName, lastName);
   filter &= lastNameFilter;
}

if (minAge != null && maxAge != null)
{
   var ageFilter = builder.And(builder.Gt(x => x.Age, minAge),
      builder.Lt(x => x.Age, maxAge));
   filter &= ageFilter;
}

var result = await _plpResultCollection.Find(filter).ToListAsync();
Run Code Online (Sandbox Code Playgroud)

  • 这就是我来这里的目的:) (2认同)
  • 如果您使用 or (|=) 表达式,这不起作用,它将返回所有集合,因为 builder.empty (2认同)

Rej*_*eja 7

您可以像这样非常简单地使用.....

var filter = Builders<Rental>.Filter.Where(s => s._id== id && s.Price==1500);
Run Code Online (Sandbox Code Playgroud)