我有这样的一段代码,其中客户是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