2015-06-15 43 views
0

我想創建一個方法來處理某個查詢。我按照張貼在鳥巢repository(60行)的例子,但仍MatchAll不被編譯器識別,如果我嘗試構建解決方案,顯示錯誤是:運營商'??'不能應用於類型IQueryContainer和lambda表達式的操作數

操作「?」不能被施加到型IQueryContainer的操作數和λ表達

這是到目前爲止我的方法:

public void ProcessQuery(IQueryContainer query = null) 
{ 

    var searchResult = this._client.Search<T>(
       s => s 
        .Index(MyIndex) 
        .AllTypes() 
        .From(0) 
        .Take(10) 
        .Query(query ?? (q => q.MatchAll())) // Not valid 
        .SearchType(SearchType.Scan) 
        .Scroll("2m") 
       ); 
} 
+1

對於使用操作??,你需要的是這種類型的查詢和(q => q.MatchAll())應該是一樣的,這是不是你提供替換的情況下IQueryContainer作爲一個Lambda,它可以填充一個Action或類似的委託,這就是它失敗的原因。匹配他們的類型,爲此獲得成功 –

回答

0

由於@Mrinal Kamboj的評論和@Wormbo的答案,我發現我自己的答案:
我改變了參數類型QueryContainer,如果該參數爲null,則創建一個新的QueryMatchAll查詢,此作品對我來說:

public void ProcessQuery(QueryContainer query = null) 
{ 

    var searchResult = this._client.Search<T>(
       s => s 
        .Index(MyIndex) 
        .AllTypes() 
        .From(0) 
        .Take(10) 
        .Query(query ?? new MatchAllQuery()) // Now works 
        .SearchType(SearchType.Scan) 
        .Scroll("2m") 
       ); 
} 
1

類型lambda表達式的可以被轉換爲Expression或一些委託類型,但最有可能不會IQueryContainer。 Lambda表達式本身沒有類型,並且需要特定的上下文才能進行自動轉換,您可以爲其提供例如通過使用適當的委託類型構造函數。但是,我不相信??的一個接口,另一個接口上的lambda表達式有任何意義。

相關問題