У меня есть этот кусок кода, где Клиенты 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]