Я использую 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"
).