ASP.NET中如何用LINQ实现MongoDB嵌套数组匹配字符串数组查询
问题原因
你遇到的编译报错是因为fooArray是数组/列表类型,无法直接访问子元素的uid属性,MongoDB C#驱动有专门的数组字段查询语法适配这类场景。
修正方案
写法1:使用Filter Builder(性能最优)
用[-1]索引代表匹配数组中的任意元素,生成的原生查询和你给出的MongoDB原生语句完全一致,不需要额外内存过滤:
public IEnumerable<Product> GetFromSites(List<string> ArrayOfUid) { var client = new MongoClient(new MongoUrl("mongodb://localhost:27017")); var db = client.GetDatabase("Database"); var productsCollection = db.GetCollection<Product>("Products"); // [-1]为MongoDB C#驱动专用语法,代表匹配fooArray下任意元素的uid字段 var filter = Builders<Product>.Filter .In(p => p.fooArray[-1].uid, ArrayOfUid); return productsCollection .Find(filter) .ToEnumerable(); }
写法2:使用LINQ语法(可读性更高)
如果更习惯LINQ写法,可以直接用Any+Contains组合,驱动会自动转换为对应的$in查询:
public IEnumerable<Product> GetFromSites(List<string> ArrayOfUid) { var client = new MongoClient(new MongoUrl("mongodb://localhost:27017")); var db = client.GetDatabase("Database"); var productsCollection = db.GetCollection<Product>("Products"); return productsCollection.AsQueryable() .Where(p => p.fooArray.Any(item => ArrayOfUid.Contains(item.uid))) .ToEnumerable(); }
注意事项
- 你原代码中存在拼写不一致的问题:
Product和Produit、productsCollection和_produits,请根据实际项目命名统一修正,避免额外报错。 - 两种写法返回的结果都自动去重,符合你需要返回P1、P2、P3、P4四条无重复文档的要求,P5因为
fooArray.uid不在目标数组中会被自动过滤。
内容的提问来源于stack exchange,提问作者Taieb
相关产品推荐
相关产品推荐

