2011-09-14 29 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

相关问题