簡體   English   中英

如何使用MongoDB c#驅動程序(版本2)搜索嵌套條件?

[英]How do I search nested criteria using MongoDB c# driver (version 2)?

我收集了一些文檔,其中可以包含按類別分組的條件。 結構可能如下所示:

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

但是,我收到錯誤消息:“無法確定實體的序列化信息...”。 我該如何工作?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM