2016-08-03 54 views
0

我有一個從SQL表中讀取的Linq查詢,並且它返回的字段中有一個來自自定義函數(在C#中)。Linq:方法沒有支持轉換爲SQL - 但如何轉儲到內存?

喜歡的東西:

var q = from my in MyTable 
     select new 
     { 
      ID = my.ID, 
      Amount = GetAmount(ID) 
     }; 

如果我做一個LinqPad q.Dump(),它顯示的結果,它告訴我它運行自定義函數沒有試圖將其發送到SQL。

現在我想這個聯盟到另一個查詢,使用:

var q1 = (from p in AnotherQuery.Union(q)... 

和我得到的錯誤Method has no supported translation to SQL

所以,我的邏輯告訴我,我需要轉儲q在內存中,然後嘗試聯合。我試着用ToList()做這件事,並創建一個從列表中填充自己的輔助查詢,但是這會導致一長串不同的錯誤。我是否在正確的軌道上,試圖讓記憶和工會聯繫在一起,還是有更好的方式來做到這一點?

+0

你配置linkPad到你的sql嗎?用EF? –

+0

沒有特定的EF配置 - 只是添加了一個連接到SQL,並將LinqPad作爲c#程序運行。 –

+0

爲了運行你的數據庫鏈接,你需要加載你的EF配置。 –

回答

1

您不能在LINQ查詢中使用任何自定義函數進行翻譯 - 只有給定LINQ提供程序支持的函數。如果你想讓你的查詢在服務器上發生,你需要堅持使用支持的功能(即使它有時意味着必須內聯可重用的代碼)。

你的兩個查詢之間的區別歸結爲投影發生的時間(和地點)。在第一種情況下,MyTable的數據是從DB返回的 - 在您的示例中,只是ID。然後,投影發生在此之上 - 在您的應用程序中調用GetAmount方法的每個ID

另一方面,在第二個查詢中不會出現這種情況,因爲在最終預測中不使用GetAmount

您或者需要用供應商可以理解的內聯查詢來替換自定義函數,或者重構所有查詢以使用支持的函數以及內存中需要執行的任何操作。向您提供示例代碼毫無意義,因爲它完全取決於您的實際查詢以及您真正想要查詢的內容。

+0

謝謝。我同意,如果沒有提供確切的代碼,您將無法提供確切的答案。但ToList()的一切,然後聯合在這似乎工作最好。謝謝。 –

+0

@CameronCastillo如果你的數據非常少,它可能效果最好。如果您希望'ToList'返回的數據變大,那麼無論如何您都必須重做一切。 – Luaan