C# EntityFramework 4.0:无法将方法转换为存储表达式

C# EntityFramework 4.0:无法将方法转换为存储表达式,c#,linq,entity-framework,C#,Linq,Entity Framework,我有一段代码,其中客户是IQueryable 当我运行该命令时,我得到的错误方法无法转换为存储表达式。现在我知道我需要为此使用EntityFunctions(即EF的规范函数),但当我检查EntityFunctions中的列表时,没有将字符串转换为整数的方法 注意:我知道如果我对对象执行Linq操作,即对IQueryable执行ToList()操作,然后进行筛选,这一切都会正常工作。但我不想这样做,因为这会降低我的性能,因为Customers表的行数太大。此外,也不可能将我的数据库字段转换为in

我有一段代码,其中客户是
IQueryable

当我运行该命令时,我得到的错误
方法无法转换为存储表达式
。现在我知道我需要为此使用EntityFunctions(即EF的规范函数),但当我检查EntityFunctions中的列表时,没有将字符串转换为整数的方法

注意:我知道如果我对对象执行Linq操作,即对IQueryable执行ToList()操作,然后进行筛选,这一切都会正常工作。但我不想这样做,因为这会降低我的性能,因为Customers表的行数太大。此外,也不可能将我的数据库字段转换为int

更新:我正在使用Sql Server 2008。不过,如果有什么帮助的话,就把它包括在内

更新2: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,你当然可以使用,但如果你是,那么我在我的评论中提供了一个链接,它以非常好和高效的方式工作

下面是我提到的链接生成的等效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]

如果所有字符串值都是有效整数,则此操作有效

var query = from c in Customers
            let salaryInt = Customers.Take(1).Select(x => c.Salary).Cast<int>().FirstOrDefault()
            where salaryInt > 5000
            select c;
var query=来自客户中的c
让salaryInt=Customers.Take(1).选择(x=>c.Salary).Cast().FirstOrDefault()
其中salaryInt>5000
选择c;

我认为这行不通。我想我会得到的新消息是:“无法将上下文。客户转换为商店表达式”@Anthony-我在客户面前删除了上下文。给我一个try@Anthony-不太清楚你想做什么,但如果你用一个示例用法更新你的答案,那会更清楚。对不起,我犯了一个错误。它是有效的:)。然而,几秒钟后,我阅读了更新后的问题。经过数小时的搜索,我找到了我答案的链接。不知道为什么它没有在谷歌的前几页出现。有点痛苦,但效果很好。我喜欢你的解决方案,它可以生成更高效的sql。我的解决方案只有在无法修改edmx文件的情况下才可行,或者在没有edmx文件的代码优先方法中才可行。
var query = from c in Customers
            let salaryInt = Customers.Take(1).Select(x => c.Salary).Cast<int>().FirstOrDefault()
            where salaryInt > 5000
            select c;