2016-02-01 80 views
0

我認爲標題解釋了所有,但這裏是我想從Simple.OData.Client獲得的;OData:通過列表過濾二級導航獲取頂級集合

public async Task<List<Party>> GetByGenres(List<Genre> Genres, params string[] expands) 
    { 
     IEnumerable<Party> rtn = null; 

     try{ 
      rtn = await client.For<Party>("Party").Filter(p => p.Genres.Any(g => Genres.Contains(g))).FindEntriesAsync(); 
     } 
     catch(Exception e){ 

     } 
     return rtn.ToList(); 
    } 

但它給

消息 「不支持 類型System.Linq.Expressions.TypedParameterExpression(參數)的表達: 克」 串

我的模型類型的ipmlements IEquatable。

任何想法?問候。

回答

1

我們習慣於LINQ表達式,我們有時會忘記在外部服務的情況下,必須有一個LINQ提供者能夠解釋我們的應用程序發送給它的表達式。 SQL數據庫.NET驅動程序通常對於此類查詢足夠有用,但即使是豐富的Microsoft SQL Server和Oracle .NET驅動程序也可能因複雜的LINQ表達式失敗,該表達式可以在內存查詢中正常工作。我們來看看你發送到OData Filter子句的表達式:p => p.Genres.Any(g => Genres.Contains(g))。您正在向表達式發送流派列表,並且希望檢查流派中是否包含某個集合中的至少一個元素。雖然OData支持Any/All子句,但我不確定上述表達式是否可以寫爲OData V3或V4服務支持的OData URI。我可能是錯誤的,但你可以嘗試寫一個對應於你的請求的OData URI查詢,將它粘貼到瀏覽器中並重新運行你的OData服務?如果是這樣,那麼這是一個Simple.OData.Client限制,我可以嘗試修復,但是我懷疑這個表達式對於當前的OData協議可能太複雜了。

+0

我決定在我的控制器上創建自定義函數。然後我使用Simple.OData.Client從我的應用程序中調用該函數。其中像魅力工作。感謝您的長時間解釋。 –