Использование SqlFunctions или эквивалентной коллекции EdmFunctions с MySql и Entity Framework - PullRequest
6 голосов
/ 11 января 2012

Я использую Linq to Entities при поддержке MySql. Я хотел бы иметь возможность использовать различные встроенные функции MySql, такие как rand. Если бы я использовал MS SQL Server, я мог бы использовать класс SqlFunctions, но это не работает с MySql; Я получаю ошибку:

Rand () для типа 'System.Data.Objects.SqlClient.SqlFunctions' не может перевести в выражение хранилища LINQ to Entities.

Я выяснил, как создать пользовательскую функцию в моей базе данных, которая упаковывает встроенный RAND:

CREATE FUNCTION Random ()
RETURNS real NOT DETERMINISTIC
RETURN RAND();

Затем я обновляю свою модель из базы данных (я использую .ebmx) и создаю статический класс следующим образом:

public static class MyUserFunctions {
    [EdmFunction("MyModelNamespace.Store", "Random")]
    public static double Random() {
        throw new ArgumentNullException();
    }
}

И это позволяет мне вызывать MyUserFunctions.Random в предложении .Where для моего класса Entities:

using (MyEntities entities = new MyEntities()) {
    // Yes, I know ORDER BY RAND() is slow
    return entities.products.OrderBy(prod => MyUserFunctions.Random()).Take(4);
}

Итак, вопрос в том, могу ли я сделать это, не создавая глупую оболочку UDF, и просто сделать все встроенные функции MySql более доступными напрямую (возможно, правильно установив свойство EdmFunction Namespace (в случае SqlFunctions пространство имен "SqlServer").

1 Ответ

0 голосов
/ 07 февраля 2014

есть некоторые Canonical Functions, которые должны поддерживать все провайдеры, см. Это: Канонические функции , но я полагаю, что Random канонической функции нет, если на Random список, вы можете просто создать CLR Method и сопоставить его с Random с помощью атрибута EdmFunction и Edm NamespaceName, и нет необходимости создавать UDF и <function> element в вашей модели ... Если не существует канонической функции Random, вы можете создать элемент function на языке определения концептуальной схемы (CSDL), содержащий элемент DefiningExpression, и написать свое утверждение (вероятно, на TSQL) в этом разделе вместо определяя UDF в DataBase, и определяя input parameter и return type для него, и сопоставляя CRL function на EdmFunction с ним, и вызывая из linq запроса, смотрите это: Модель вызова Функции в запросах

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