Linq to EF - неподдерживаемые функции - PullRequest
3 голосов
/ 20 февраля 2012

Я делаю запрос с Linq, подкрепленный источником данных Entity Framework.

Я получаю следующую ошибку:

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

Вот упрощенная версия моей функции (моя версия более сложная и использует ACos, sin, cos идругие функции класса C # Math).

  var objects =
            from n in context.Products.Where(p => p.r == r)
            let a = Math.Sqrt((double)n.Latitude)
            where a < 5
            orderby a
            select n;

        return objects.Take(100).ToList();

Я думаю, что проблема может быть связана с ситуацией, когда Linq для EF (и источник данных SQL) имеет ограниченный набор поддерживаемых функций по сравнению с Linq для SQL.Я относительно новичок в этом, поэтому я не уверен на 100%.

Кто-нибудь может дать мне указатель в правильном направлении?

Приветствия,

Ответы [ 3 ]

14 голосов
/ 20 февраля 2012

Попробуйте SquareRoot функция, определенная в SqlFunctions

    var objects =
        from n in context.Products.Where(p => p.r == r)
        let a = SqlFunctions.SquareRoot((double)n.Latitude)
        where a < 5
        orderby a
        select n;

    return objects.Take(100).ToList();
5 голосов
/ 20 февраля 2012

Если вы начнете изучать LINQ с LINQ-to-objects, вы столкнетесь с этим много раз, как только начнете использовать LINQ-to-Entities.

Вы можете делать практически все, что скомпилируется вLINQ-to-objects, поскольку LINQ-to-objects при компиляции преобразуется в code .

LINQ-to-Entities (и LINQ-to-SQL) преобразуется в деревья выражений.Таким образом, допустим только тот синтаксис, который разрешен для этого конкретного поставщика LINQ.В моем первом «реальном» выражении LINQ-to-Entities, которое скомпилировалось просто отлично, я столкнулся с этой ошибкой около 5 раз, когда один за другим я удалял код, который не обрабатывался LINQ-to-Entities.

Так что, когда вы видите это, это нормально и распространено.Вы должны найти другой путь каждый раз.

Вы можете избежать проблемы с помощью логического эквивалента:

var objects =
    from n in context.Products.Where(p => p.r == r)
    where (double)n.Latitude < 25
    orderby a
    select n;

return objects.Take(100).ToList();

Вы также можете получить все данные для клиента и затем запустить свой код, используя LINQ-to-objects:

var objects =
    from n in context.Products.Where(p => p.r == r).ToList()
    let a = Math.Sqrt((double)n.Latitude)
    where a < 5
    orderby a
    select n;

return objects.Take(100).ToList();

Наконец, у вас должна получиться математика на сервере.Проверьте System.Data.Objects.SqlClient.SqlFunctions SqlFunctions Class .Эти функции переведут в выражение. Это, в частности, похоже, что это может быть билет .

1 голос
/ 20 февраля 2012

Пожалуйста, попробуйте

var objects =
        from n in context.Products.Where(p => p.r == r)
        let a = Math.Pow((double)n.Latitude, 0.5)
        where a < 5
        orderby a
        select n;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...