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

时间:2015-06-03 15:44:51

标签: c# linq mongodb mongodb-.net-driver mongodb-csharp-2.0

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

{
     "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; }
}

用户可以从每个类别中选择要搜索的条件(作为IEnumerable<CriteriaEntity>进入函数),并且文档必须包含所有选定的条件才能返回。这是我的第一次尝试:

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))))));

但是我收到错误:&#34;无法确定实体的序列化信息......&#34;。我怎样才能让它发挥作用?

1 个答案:

答案 0 :(得分:1)

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();