2011-09-14 30 views
4

我有這樣的一段代碼,其中客戶是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] 
+0

我發現鏈接到我的答案小時後搜索。不知道爲什麼它在前幾頁沒有在谷歌彈出。 http://stackoverflow.com/questions/5971521/linq-to-entities-does-not-recognize-the-method-double-parsesystem-string-meth。痛苦但甜蜜地工作。 – TCM

+0

我喜歡你的解決方案,它會產生更高效的sql。我的解決方案只有在你不能修改你的edmx文件的情況下或在你沒有的代碼優先的方法中才可行。 – Aducci

回答

3

這將工作,如果所有的字符串值都是有效的整數

var query = from c in Customers 
      let salaryInt = Customers.Take(1).Select(x => c.Salary).Cast<int>().FirstOrDefault() 
      where salaryInt > 5000 
      select c; 
+0

我不認爲這會起作用。我想我會得到的新內容是:「不能將上下文翻譯成客戶表達」 – TCM

+0

@Anthony - 我在客戶面前刪除了上下文。試一試 – Aducci

+0

@Anthony - 不完全確定你正在嘗試做什麼,但是如果你更新了你的答案和示例用法,它會更加清晰 – Aducci

相關問題