如何使用MongoDB c#驱动程序(版本2)搜索嵌套条件?

如何使用MongoDB c#驱动程序(版本2)搜索嵌套条件?,c#,linq,mongodb,mongodb-.net-driver,mongodb-csharp-2.0,C#,Linq,Mongodb,Mongodb .net Driver,Mongodb Csharp 2.0,我有一个文档集合,可以包含按类别分组的标准。结构可以如下所示: { "Name": "MyDoc", "Criteria" : [ { "Category" : "Areas", "Values" : ["Front", "Left"] }, { "Category" : "Severity", "Values" : [

我有一个文档集合,可以包含按类别分组的标准。结构可以如下所示:

{
     "Name": "MyDoc",
     "Criteria" : [
         {
             "Category" : "Areas",
             "Values" : ["Front", "Left"]
         },
         {
             "Category" : "Severity",
             "Values" : ["High"]
         }
      ]
}
public class CriteriaEntity
{
    public string Category { get; set; }
    public IEnumerable<string> Values { get; set; }
}
我用于为条件创建嵌入文档的类如下所示:

{
     "Name": "MyDoc",
     "Criteria" : [
         {
             "Category" : "Areas",
             "Values" : ["Front", "Left"]
         },
         {
             "Category" : "Severity",
             "Values" : ["High"]
         }
      ]
}
public class CriteriaEntity
{
    public string Category { get; set; }
    public IEnumerable<string> Values { get; set; }
}
公共类标准实体
{
公共字符串类别{get;set;}
公共IEnumerable值{get;set;}
}
用户可以从每个类别中选择要搜索的条件(作为
IEnumerable
进入函数),文档必须包含所有选择的条件才能返回。这是我第一次尝试:

var filterBuilder = Builders<T>.Filter;
var filters = new List<FilterDefinition<T>>();

filters.Add(filterBuilder.Exists(entity => 
    userCriterias.All(userCriteria => 
        entity.Criteria.Any(entityCriteria => 
            entityCriteria.Category == userCriteria.Category
            && userCriteria.Values.All(userValue =>
                entityCriteria.Values.Any(entityValue =>
                    entityValue == userValue))))));
var filterBuilder=Builders.Filter;
var filters=新列表();
filters.Add(filterBuilder.Exists)(实体=>
userCriterias.All(userCriterias=>
entity.Criteria.Any(entityCriteria=>
entityCriteria.Category==userCriteria.Category
&&userCriteria.Values.All(userValue=>
entityCriteria.Values.Any(entityValue=>
entityValue==userValue(()()));

但是我得到了错误:“无法确定实体的序列化信息…”。我如何才能让它工作?

MongoDB.Driver 2.0不支持Linq.All。无论如何,您的任务可以通过下一种方式解决:

var filterDefinitions = new List<FilterDefinition<DocumentEntity>>();
foreach (var criteria in searchCriterias)
{
        filterDefinitions
           .AddRange(criteria.Values
           .Select(value => new ExpressionFilterDefinition<DocumentEntity>(doc => doc.Criterias
               .Any(x => x.Category == criteria.Category && x.Values.Contains(value)))));
}

var filter = Builders<DocumentEntity>.Filter.And(filterDefinitions);
return await GetCollection<DocumentEntity>().Find(filter).ToListAsync();
var filterDefinitions=new List();
foreach(搜索标准中的var标准)
{
过滤器定义
.AddRange(标准值)
.Select(值=>newexpressionFilterDefinition(文档=>doc.Criterias
.Any(x=>x.Category==criteria.Category&&x.Values.Contains(value '));
}
var filter=Builders.filter.And(filterDefinitions);
返回wait wait GetCollection().Find(filter.ToListAsync();
Hi,在MongoDB中,“嵌套”元素或内部元素称为“文档”,请查找IBsonDocumentSerializer和接口,以便将它们应用于实体。