2013-12-11 42 views
2

下實體給出:ArgumentNullException與ElemMatch

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) 

我該如何解決這個限制/錯誤?

回答

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知道別名是一個數組,將「搜索」爲名而不是「只是比較」