与ElemMatch的ArgumentNullException

时间:2013-12-11 15:21:18

标签: c# .net mongodb mongodb-.net-driver mongodb-query

给出以下实体:

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)

我如何解决此限制/错误?

1 个答案:

答案 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知道别名是一个数组,它将“搜索”该名称,而不是“只是比较”