我有這樣的一段代碼,其中客戶是IQueryable<Customer>
的EntityFramework 4.0:方法不能被翻譯成店表達
Customers = Customers.Where (C => Int32.Parse(C.Salary) > 5000);
當我跑,我得到錯誤Method cannot be translated into a store expression
。現在我知道我需要使用EntityFunctions(即EF的Canonical函數),但是當我在EntityFunctions中檢查列表時,沒有可用於將字符串轉換爲整數的方法。
注:我知道如果我做Linq的對象,即對IQueryable做一個ToList(),然後過濾,它都可以。但我不想這樣做,因爲這會降低我的性能,因爲Customers表的行數太大。也不可能將我的數據庫字段轉換爲int。
UPDATE:我正在使用Sql Server 2008.只要包括它,如果它可以有任何幫助。
UPDATE2: Aducci在他的回答中提供了一個真正棘手和聰明的解決方案。但是從它生成的Sql非常難看。舉個例子:
SELECT
[GroupBy1].[A1] AS [C1]
FROM (SELECT
COUNT(1) AS [A1]
FROM (SELECT
[Project2].[C1] AS [C1],
(SELECT TOP (1) [top].[C1] AS [C1]
FROM (SELECT TOP (1)
CAST([Project2].[PostalCode] AS int) AS [C1]
FROM [dbo].[Customers] AS [c]
) AS [top]) AS [C2]
FROM (SELECT
[Extent1].[PostalCode] AS [PostalCode],
(SELECT TOP (1) [top].[C1] AS [C1]
FROM (SELECT TOP (1)
CAST([Extent1].[PostalCode] AS int) AS [C1]
FROM [dbo].[Customers] AS [c]
) AS [top]) AS [C1]
FROM [dbo].[Customers] AS [Extent1]
) AS [Project2]
) AS [Project4]
WHERE (CASE WHEN ([Project4].[C1] IS NULL) THEN 0 ELSE [Project4].[C2] END) > 5000
) AS [GroupBy1]
唯一的區別是它使用郵政編碼而不是工資。如果你不是真的很擔心這個醜陋的Sql,你可以肯定使用,但如果你是我在我的評論中提供了1個鏈接,它以非常好的和高性能的方式工作。
這裏是由鏈接產生的相應的SQL我剛纔所說的:
SELECT
[GroupBy1].[A1] AS [C1]
FROM (SELECT
COUNT(1) AS [A1]
FROM [dbo].[Customers] AS [Extent1]
WHERE CAST( CAST([Extent1].[PostalCode] AS int) AS float) > cast(5000 as float(53))
) AS [GroupBy1]
我發現鏈接到我的答案小時後搜索。不知道爲什麼它在前幾頁沒有在谷歌彈出。 http://stackoverflow.com/questions/5971521/linq-to-entities-does-not-recognize-the-method-double-parsesystem-string-meth。痛苦但甜蜜地工作。 – TCM
我喜歡你的解決方案,它會產生更高效的sql。我的解決方案只有在你不能修改你的edmx文件的情況下或在你沒有的代碼優先的方法中才可行。 – Aducci