使用Linq

时间:2019-08-02 11:28:11

标签: c# mongodb

我有一个模型,例如:

{
  nestedArray1: [
    {
      nestedArray2: [
        {
          id: 1
        }
      ]
    }
  ]
}

我正在尝试获取包含nestedArray2且ID值在列表x = [1, 2, 3, 4, 5, ...]中的项目。

我尝试不成功地运行以下查询:

var query = model.AsQueryable().Where(m => m.nestedArray1.Any(s => s.nestedArray2.Any(m => ids.Any(id => id == m.id))));
var results = query.ToListAsync();

它说不支持任何过滤器。

使用Linq编写这样的查询的正确方法是什么?

注意:

以下是我使用Mongo查询语法的方法:

db.getCollection('model').find({
    "nestedArray1": {
        $elemMatch:{
            nestedArray2:{
                $elemMatch:{
                  "id" : {$in: [1, 2, 3, 4, 5] }
            }
        }
    }
}

})

这是我如何在不使用Linq查询语法的情况下使用C#做到这一点:

var ids = new List<int>() { 1, 2, 3, 4, 5};
var filter = new FilterDefinitionBuilder<Model>()
        .ElemMatch(p => p.nestedArray1, new FilterDefinitionBuilder<NestedModel1>()
            .ElemMatch(s => s.nestedArray2, new FilterDefinitionBuilder<NestedModel2>()
                .In(m=> m.id, ids)));
return await Collection.Find(filter).ToListAsync();

1 个答案:

答案 0 :(得分:1)

根据您的模型,nestedArray2的项只有一个具有一个ID的字段。

因此,考虑到上面的示例,您应该具有以下内容(我认为):

var query = model.AsQueryable().Where(m => m.nestedArray1.Any(s => s.nestedArray2.Any(m => ids.Contains(m.id))));