Передача математической формулы в структуру сущности - PullRequest
1 голос
/ 02 января 2011

Я пишу формулу в функции и передаю ее в мой запрос EF.Это не работает.Но такие функции, как Math.Pow (x, x) работают.Зачем?Нужно ли мне интегрировать мою формулу непосредственно в мои запросы?

var i = from u in Locations
    where (SquareRoot(u.SomeField) < radius)
    select u;

    public double SquareRoot(double val)
    {
    return Math.Pow(val, 0.5);
    }

Но это работает:

var i = from u in Locations
    where (Math.Pow(u.SomeField, 0.5) < radius)
    select u;

Фактические формулы, которые я хочу использовать, будут намного больше, чем простой квадрат.Формулы, такие как расстояние между точками на земле и т. Д. Вот почему я хотел бы выделить мои формулы из запроса и использовать их в качестве функций.

Фактическая формула выглядит следующим образом:

public double DistanceBetweenPoints(double centerLat, double centerLon, double pointLat, double pointLon)
{
    const double sphericalValue = 69.1;
    return Math.Sqrt((Math.Pow(sphericalValue*(pointLat-centerLat), 2)) + (Math.Pow(sphericalValue*(pointLon-centerLon)*Math.Cos(centerLat/57.3), 2)));
}

Math.Sqrt () и Math.Cos не поддерживаются EF.

1 Ответ

2 голосов
/ 02 января 2011

Потому что фреймворк не может понять, как перевести ваш метод в SQL. Вы просите слишком много структуры, чтобы быть в состоянии сделать это. Когда поставщик запросов встречает вызов одного из ваших методов в дереве выражений (Expression.Call), он отмечает, что вызываемый метод не является тем, который он знает, как анализировать, и проверяет соответственно.

Однако, предоставленный запрос знает, как перевести Math.Pow в POWER, потому что он был спроектирован таким образом.

Это действительно так просто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...