2013-10-23 63 views
2

我寫的Linq查詢如下:但是上運行其拋出以下錯誤:OUTER JOIN不是在LINQ查詢工作:方法「加入」不能走法「的SelectMany」或不支持

The method 'Join' cannot follow the method 'SelectMany' or is not supported. Try writing the query in terms of supported methods or call the 'AsEnumerable' or 'ToList' method before calling unsupported methods.

LINQ

from a in AccountSet 
join sm in new_schoolMemberSet on a.AccountId equals sm.new_OrganisationId.Id 
     into ps from suboc in ps.DefaultIfEmpty() 
join sr in new_schoolRoleSet on suboc.new_SchoolRoleId.Id equals sr.new_schoolRoleId 
where sr.new_name == "Manager" 
where a.new_OrganisationType.Value == 430870007 
select new { a.AccountId, suboc.new_schoolMemberName } 

我期待下面的結果:

enter image description here

我從來沒有使用外前Linq中加入。所以請糾正我,如果我做錯了。

謝謝

回答

1

錯誤似乎很清楚。問題不在於Linq,而是由於提供者無法將你的查詢翻譯成它可以在其最後執行的東西。爲了測試該理論,您可以簡單地將.ToList()添加到AccountSet,new_schoolMemberSetnew_schoolRoleSet的末尾。這不是你想如何運行查詢,而是作爲查詢是否存在錯誤的證據,或提供者(基於錯誤,它是提供者,但這仍然證明查詢形成正確)。

ToList()添加到這些集合中的每一個都會將所有數據存入內存,並且將使用linq-to-objects而不是linq-to-whateverYourLinqProviderIs。一些linq提供者根本沒有裝備來處理更復雜的查詢。您可以想象將linq查詢轉換爲供應商可以理解的查詢格式的難度。另外,一些linq查詢概念並不能轉化爲特定提供者可能的東西。

那有什麼解決辦法?您希望利用linq提供程序高效查詢數據的能力,但可能會限制它的功能。嘗試使用過濾等方式將最少量的數據存入內存中,支持,然後使用linq-to-objects完成剩餘的數據。

+0

嗨,謝謝你的回答。我根據你的建議嘗試過。現在它的含義是'對象引用不會設置爲對象的實例'。我現在還用accountId篩選結果。錯誤時,鏈接板也會突出顯示'suboc'。 – Scorpion

+0

問題是,對於外連接,連接的一側可能爲空。所以當你在ps.DefaultIfEmpty()中編寫suboc時,suboc有可能爲空。當你使用'suboc.new_SchoolRoleId.Id'或'suboc.new_schoolMemberName'時,'suboc'爲null,所以你會得到一個異常。你可以通過做一些類似'suboc == null'的方式來提供默認值。 string.empty:suboc.someProperty'。 – Ocelot20

+0

在這裏看到一些明確的外部連接的例子/鏈接:http://stackoverflow.com/questions/3404975/left-outer-join-in-linq – Ocelot20

相關問題