2010-09-14 24 views
2

我使用LINQ與ODATA Web服務System.NotSupportedException:只能項目查詢中的最後一個實體類型被翻譯

from tp in TyrePatterns 
from t in tp.Tyres 
where t.Diameter == 195 
select tp 

看起來很簡單,對不對?輪胎是TyrePatterns的動力。所以,只是要確定你能看到什麼,我想做的事情,我在做什麼在SQL的神奇世界看起來是這樣的:

SELECT DISTINCT TyrePatterns.Name 
FROM TyrePatterns 
INNER JOIN Tyres ON Tyres.TyreID = TyrePatterns.TyreID 
WHERE Tyres.Diameter = 195 

在我們的網站,並在LINQPad中,LINQ代碼給運行時錯誤:

System.NotSupportedException: Can only project the last entity type in the query being translated.

深入瞭解該錯誤實際上意味着和解決方案將是真棒。

回答

2

在OData的加入兩個表可以通過兩種方式來完成: 導航,這樣的事情: /TyrePatterns(ID)/輪胎$過濾器=直徑EQ 195 但這是假設你知道TypePattern的id你正在尋找(它似乎不是你要找的內容)

或擴展: /TyrePatterns $展開;輪胎 但你只能將過濾器應用於TyrePatterns,不給?達到輪胎。

所以去這個查詢的正確方法是倒過來: /輪胎$過濾器=直徑EQ 195 & $擴大= TyrePattern 這將返回所有輪胎,直徑195,它也將包括其TypePattern (假設導航屬性是雙向的。這不正是你想要的人,但它是你可以得到的最接近的一次。

翻譯成LINQ這看起來像

from t in Tyres.Expand("TyrePatterns") where t.Diameter == 195 select t

然後,您可以輕鬆地在客戶端上選擇TyrePatterns。

限制是您只能將過濾器應用到導航中的最後一個段(URL的路徑部分)。

+0

我有這個想法,但不幸的是,它不是我所需要的。我想要一個TyrePatterns表(TyrePattern.Name)的列。 TyrePatterns和Tyres之間存在一對多的關係(每TyrePattern有許多輪胎)。通過選擇Tyres而不是TyrePatterns,我得到了重複的結果,因爲我無法做出Distinct,因爲使用Distinct會給出不同的運行時錯誤。 – Zac 2010-09-16 13:40:32

+0

你可以在客戶端做不同的事情(它會下載更多)。要在客戶端上運行它,只需在服務器上運行任何東西之後添加.AsEnumerable()。 AsEnumerable()之後的所有內容都將在客戶端本地執行(絕對支持Distinct)。 – 2010-09-16 16:28:56

+0

感謝您的回答,我希望我可以將其標記爲有用!作爲一種解決辦法,然而這似乎仍然不盡人意;這可能意味着需要大量的冗餘數據(幾個數量級以上)。我也嘗試去做一個小組,作爲擺脫重複的手段,但是這也給了一個不支持的例外。 – Zac 2010-09-27 10:04:15

相關問題