我有一个模型,例如:
{
nestedArray1: [
{
nestedArray2: [
{
id: 1
}
]
}
]
}
我正在尝试获取包含nestedarray2的项目,其中列表x = [1, 2, 3, 4, 5, ...]
中的ID值。
我尝试运行以下查询而无用:
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] }
}
}
}
}
}(
这是我可以使用c#而无需linq查询语法进行操作的方法:
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();
根据您的模型,NestedArray2的项目只有一个具有一个ID的字段。
因此,考虑到上面的示例,您应该有这样的东西(我认为(:
var query = model.AsQueryable().Where(m => m.nestedArray1.Any(s => s.nestedArray2.Any(m => ids.Contains(m.id))));