我有一個MongoDB數據庫,每個數據庫都存儲一個特定類型的對象。我想實現一個通用的選擇功能,以在下面的定義上的特定集合操作取決於類型,如:MongoDB與C#:查找具有自定義謂詞的元素
object[] Select<T>(Func<T, bool> condition)
例如,如果對象類型之一是Person
類,我將實現以下:
object[] Select<T>(Func<T, bool> condition)
{
if (typeof(T) == typeof(Person))
{
Func<Person, bool> f = (Person p) =>
{
return true;
};
return this.collectionPersons.AsQueryable().Where(p=>f(p)).ToArray();
}
else // ...
}
此代碼編譯,但是當我嘗試運行它,我得到與
Additional information: Unsupported filter:
Invoke(value(System.Func`2[Person,System.Boolean]), {document}).
一個System.ArgumentException
細讀之後API文檔我有這樣的印象:通常不可能使用抽象類型的lambda表達式(如上例),但僅支持 FilterDefinitionBuilder
支持的那些類型,例如Gt()
,Eq()
等 我很好奇,如果我理解這正確或存在一種可能性來查詢具有抽象謂詞的集合(我對MongoDB C#驅動程序相當陌生)。
感謝Maksim,我試圖完全按照您的建議來實現Expression,而不是Predicate。以下錯誤是我得到的: MongoDB.Driver.Linq.IMongoQueryable'不包含'Where'和最佳擴展方法重載的定義'System.Linq.Queryable.Where (System.Linq.IQueryable ,System.Linq.Expressions.Expression >)'有一些無效的參數。 我自然不會以這種方式查詢所有項目,'返回true;'只是最簡單的情況,反正無效。 –
我已經嘗試過現在,用這種方法我已經在回答(我已經更新了一個litle位),我可以查詢我的收藏。 –
@AlexKonnen也許你錯過了一些使用聲明? –