Использование SQRT в запросе Linq EF - PullRequest
3 голосов
/ 24 октября 2009

Мне нужно использовать функцию SQRT как часть предложения where в запросе Linq EF. Я подумал, что смогу сделать это:

var qry = context.MyTable.Where("sqrt(it.field) > 1");

Но он возвращает ошибку, в которой говорится, что «sqrt не может быть преобразован в допустимый конструктор или функцию типа. Рядом с функцией, методом или конструктором типа, строка 6, столбец 5».

Я всегда предполагал, что linq буквально берет то, что есть в предложении where, и переводит это в оператор, который выполняется непосредственно в SQL. Кажется, это не так ...

Кто-нибудь знает обходной путь?

Спасибо

Ответы [ 4 ]

8 голосов
/ 08 ноября 2010

Я не знаю, как ты получил свой ответ, работая против EF. Когда я попробовал это с EF4, у меня не получилось. Я бы получил:

LINQ to Entities не распознает метод метода Double Sqrt (Double), и этот метод нельзя преобразовать в выражение хранилища.

Таким образом, после того, как я некоторое время ударился об это (в конце концов, Math.Pow(double) поддерживается и SQRT доступен в SQL), я понял, что корень квадратный из значения такой же, как и его сила половина.

Итак, это решение отлично работает.

from e in context.MyEntities
     let s = Math.Pow(e.MyDouble, 0.5)
     select s;

Сгенерированный SQL использует POWER вместо SQRT:

SELECT 
POWER( CAST( [Extent1].[MyDouble] AS float), cast(0.5 as float(53))) AS [C1]
FROM [dbo].[MyEntities] AS [Extent1]

Достаточно простой обходной путь для решения проблемы. Надеюсь, это поможет кому-то еще.

2 голосов
/ 25 октября 2009

Я использую Linq Entities и смог сделать это:

        testEntities entities = new testEntities ();

        ObjectQuery<Fees> fees = entities.Fees;

        return from f in fees 
               let s = Math.Sqrt((double)f.FeeAmount)
               where s > 1.0 
               select f ;

Когда я проверяю сгенерированный SQL, я получаю

SELECT [t1].[TestTriggerID]
FROM (
    SELECT [t0].[TestTriggerID], SQRT(CONVERT(Float,[t0].[TestTriggerID])) AS [value]
    FROM [TestTrigger2] AS [t0]
    ) AS [t1]
WHERE [t1].[value] > @p0

Это кажется разумным. Мне не удалось использовать строковый формат .Where для воспроизведения того же кода, но я, вероятно, упускаю что-то очевидное.

1 голос
/ 30 октября 2009

Проверьте документ msdn .Entity sql не поддерживает функцию sqrt.

0 голосов
/ 15 мая 2014

Вы можете использовать System.Data.Entity.SqlServer.SqlFunctions.SquareRoot с EF6.

...