You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 09:15:01