使用and或运算符的Mongodb c#过滤器

使用and或运算符的Mongodb c#过滤器,c#,asp.net-mvc,mongodb,linq,filter,C#,Asp.net Mvc,Mongodb,Linq,Filter,我在mongodb 样本 { "SchemaName": "Intelligence", "SchemaDescription": "WindPower", "SchemaType": "WindPower", "SchemaTypeId": 1, "SchemaData": { "ProjectId": 1, "LastUpdated": "2016-07-02T19:27:28.000+0000", "ProjectName": "Zhonghuashan II",

我在
mongodb

样本

{
 "SchemaName": "Intelligence",
 "SchemaDescription": "WindPower",
 "SchemaType": "WindPower",
 "SchemaTypeId": 1,
 "SchemaData": {
  "ProjectId": 1,
  "LastUpdated": "2016-07-02T19:27:28.000+0000",
  "ProjectName": "Zhonghuashan II",
  "Capacity": 49.0,
  "Technology": "Onshore",
   "Country":{
          "CountryId":1,
          "CountryName":"UnitedKingdom",
          "CountryCode":"UK"
    }
 }
}
现在我根据搜索条件过滤数据

var filter = Builders<Schema>.Filter.Or(
                Builders<Schema>.Filter.Where(p => p.SchemaData.ProjectName.ToLower().Contains(searchCriteria.ProjectName.ToLower())),
                Builders<Schema>.Filter.Where(p => p.SchemaData.Technology.ToLower().Contains(searchCriteria.Technology.ToLower())),
                Builders<Schema>.Filter.Where(p => p.SchemaData.Country.CountryName.ToLower().Contains(searchCriteria.Country.ToLower()))
            );
            var list = await collectionHandler.ReadOnly<Schema>().FindSync(filter).ToListAsync();
            return list;
var filter=Builders.filter.Or(
其中(p=>p.SchemaData.ProjectName.ToLower().Contains(searchCriteria.ProjectName.ToLower()),
Builders.Filter.Where(p=>p.SchemaData.Technology.ToLower().Contains(searchCriteria.Technology.ToLower()),
Builders.Filter.Where(p=>p.SchemaData.Country.CountryName.ToLower().Contains(searchCriteria.Country.ToLower())
);
var list=await collectionHandler.ReadOnly().FindSync(filter.ToListAsync();
退货清单;
我需要添加条件

  • searchCriteria.ProjectName=”“||searchCriteria.Technology=“||searchCriteria.Country=”“=返回所有记录

  • searchCriteria.ProjectName=“abc”和searchCriteria.Technology=“xyz”| | searchCriteria.Country=”“=返回匹配的记录

  • searchCriteria.ProjectName=“abc”和searchCriteria.Technology=“xyz”和searchCriteria.Country=“pqr”=返回匹配的记录

  • searchCriteria.ProjectName=“| | searchCriteria.Technology=“xyz”和searchCriteria.Country=“pqr”=返回匹配的记录

  • searchCriteria.Technology=”“=“abc”| | searchCriteria.Technology=“xyz”和searchCriteria.Country=“pqr”=返回匹配的记录


  • 假设搜索条件的任何属性都可以与搜索条件的其他属性结合使用and and or

    对于我来说,直接将过滤器作为字符串传递是很舒服的:

        FilterDefinition<BsonDocument> filter = @"{ ""Prop"": { $Or: [{ $and: [...] },{ $and: [...] }] } }";
        var lst = collection.Find(filter);
    
    filterDefinitionFilter=@“{”“Prop”“:{$Or:[{$and:[…]},{$and:[…]}]}”;
    var lst=collection.Find(过滤器);
    
    您可以查看文档:
    我是这样做的:

    以这个答案为基础

            var idFilter = new BsonDocument { { "_id", new BsonDocument { { "$regex", codeRegex }, { "$options", "i" } } } };
            var nameFilter = new BsonDocument { { "Name", new BsonDocument { { "$regex", codeRegex }, { "$options", "i" } } } };
    
            var filter = new BsonDocument("$or", new BsonArray { idFilter, nameFilter });
    
            var query = _collection.Find(filter)                
                .SortBy(c=>c.Id);
            return query.ToList();