EntityFramework 4.0: метод не может быть переведен в выражение магазина - PullRequest
4 голосов
/ 14 сентября 2011

У меня есть этот кусок кода, где Клиенты IQueryable<Customer>

Customers = Customers.Where ( C => Int32.Parse(C.Salary) > 5000);

Когда я запускаю это, я получаю ошибку Method cannot be translated into a store expression. Теперь я знаю, что для этого мне нужно использовать EntityFunctions (т. Е. Канонические функции для EF), но когда я проверил список в EntityFunctions, для преобразования строки в целое число не было никакого способа.

Примечание: Я знаю, если я сделаю Linq to Objects, то есть сделаю ToList () для IQueryable и затем отфильтрую, все будет работать. Но я не хочу этого делать, так как это ухудшит мою производительность, поскольку количество строк в таблице клиентов слишком велико. Также невозможно преобразовать мое поле базы данных в int.

ОБНОВЛЕНИЕ: Я использую Sql Server 2008. Просто включите его, если он может помочь.

ОБНОВЛЕНИЕ 2: В своем ответе Адуччи предложил очень хитрое и умное решение. Однако 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]

1 Ответ

3 голосов
/ 14 сентября 2011

Это будет работать, если все строковые значения являются действительными целыми числами

var query = from c in Customers
            let salaryInt = Customers.Take(1).Select(x => c.Salary).Cast<int>().FirstOrDefault()
            where salaryInt > 5000
            select c;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...