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
。有人能提出解决方案吗?
异常消息绕过完全采用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");