给出以下实体:
public class MyClass
{
public MyClass()
{
Aliases= new List<string>();
}
public Guid Id { get; set; }
public string Name { get; set; }
public List<string> Aliases{ get; set; }
}
我想使用以下查询按名称或任何匹配的别名进行搜索:
Query.Or(
Query<MyClass>.Matches(a => a.Name, request.Name),
Query<MyClass>.ElemMatch(a => a.Aliases, query => query.Matches(alias => alias, request.Name))
)
只要myClass.Aliases.Count > 0
,此查询就可以正常运行!但是一旦它空了我就会得到以下异常:
System.ArgumentNullException was unhandled by user code
HResult=-2147467261
Message=Value cannot be null.
Parameter name: name
Source=MongoDB.Driver
ParamName=name
StackTrace:
at MongoDB.Driver.Builders.Query.Matches(String name, BsonRegularExpression regex)
at MongoDB.Driver.Builders.QueryBuilder`1.Matches(Expression`1 memberExpression, BsonRegularExpression regex)
at My.Namespace.MyService.<>c__DisplayClassf.<Get>b__d(QueryBuilder`1 builder) in c:\Dev\....cs:line 148
at MongoDB.Driver.Builders.QueryBuilder`1.ElemMatch[TValue](Expression`1 memberExpression, Func`2 elementQueryBuilderFunction)
at MongoDB.Driver.Builders.Query`1.ElemMatch[TValue](Expression`1 memberExpression, Func`2 elementQueryBuilderFunction)
我如何解决此限制/错误?
答案 0 :(得分:2)
ElemMatch
不会像where子句那样过滤结果,它只会将返回的数组限制为一个匹配项,或者不限制。您需要先过滤文档,然后将数组限制在其中。
你应该像这样使用Eq
:
Query.Or(
Query<MyClass>.EQ(a => a.Name, request.Name),
Query<MyClass>.EQ(a => a.Aliases, request.Name));
让我们假设request.Name = "bar"
和查询应如下所示:
{
"$or" : [
{
"Name" : "bar"
},
{
"Aliases" : "bar"
}]
}
MongoDB知道别名是一个数组,它将“搜索”该名称,而不是“只是比较”