【发布时间】:2012-01-10 23:28:52
【问题描述】:
我正在使用由 MySql 支持的 Linq to Entities。我希望能够使用各种内置的 MySql 函数,例如rand。如果我使用的是 MS SQL Server,我可以使用 SqlFunctions 类,但这不适用于 MySql;我得到错误:
“System.Data.Objects.SqlClient.SqlFunctions”类型上的 Rand() 不能 被翻译成 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();
}
}
这让我可以在 .Where 子句中调用 MyUserFunctions.Random 来覆盖我的 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")。
【问题讨论】:
-
您是否已将 MySQL .NEt 连接器添加到您的项目中? dev.mysql.com/downloads/connector/net
标签: mysql entity-framework linq-to-entities