MongoDB c# - LINQ包含对字符串数组抛出ArgumentException

本文关键字:数组 ArgumentException 字符串 LINQ 包含 MongoDB | 更新日期: 2023-09-27 18:03:29

我是MongoDB的新手,所以这可能是一个天真的问题,但我还没有找到任何相关的/最新的信息通过谷歌搜索:我试图使用MongoDB c#驱动程序(版本2.2.4)组成一个基于linq的查询,一次一块,从收到的filter POCO对象,像这样:

IQueryable<BsonDocument> parts = collection.AsQueryable();
if (filter.Name != null)
    parts = parts.Where(d => d["Name"].Equals(filter.Name));
// ... etc; I'll then call ToList() to get results ...

现在,我的filter属性之一是一个字符串数组,这意味着我应该匹配任何文档,其字段Vendor (MongoDB文档中的字符串属性)等于数组中的任何字符串(如MongoDB原生$in: https://docs.mongodb.com/manual/reference/operator/query/in/)。

为此,我尝试了Contains(1大小的数组的特殊情况只是一个优化):

if (filter.Vendors != null && filter.Vendors.Length > 0)
{
    parts = filter.Vendors.Length == 1
        ? parts.Where(d => d["Vendor"].Equals(filter.Vendors[0]))
        : parts.Where(d => filter.Vendors.Contains(d["Vendor"].AsString));
}

可以编译,但是会抛出ArgumentException: "Expression of type 'MongoDB.Bson。BsonValue'不能用于'System '类型的参数。方法'Boolean Contains[String](System. collections . generic . ienumerable ' 1[System. collections . generic . ienumerable ' 1])system . String)"字符串)。

看http://mongodb.github.io/mongo-csharp-driver/2.2/reference/driver/crud/linq/,没有关于Contains$in;然而,从https://jira.mongodb.org/browse/CSHARP-462看来,驱动程序现在应该能够处理该方法。

BTW,如果我稍微改变一下代码,同样会发生:

   parts.Where(d => filter.Vendors.Any(s=> d["Vendor"].Equals(s)));

根本不涉及Contains。异常消息抱怨不能将BsonValue用于string,而BsonValue恰好是string。有人能提出解决方案吗?

MongoDB c# - LINQ包含对字符串数组抛出ArgumentException

异常消息绕过完全采用BsonValue的想法,让mongo处理类型,而不是试图转换为string。我得到了它的工作有供应商作为类型List<BsonValue>

class Filter
{ 
        public List<BsonValue> Vendors { get; set; }
}
...
var list = parts.Where(d => filter.Vendors.Contains(d["Vendor"]));
foreach (var document in list)
{
    Console.WriteLine(document["Name"]);
}

另一种选择是将文档映射到c#类,而不是使用BsonDocument作为集合类型。

class MyDocument
{
    public ObjectId Id { get; set; }
    public string Name { get; set; }
    public string Vendor { get; set; }
}
...
var collection = db.GetCollection <MyDocument> ("parts");