我正在使用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();
}
}
这允许我在我的Entities类的.Where子句中调用MyUserFunctions.Random:
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
的{{1}}属性(在Namespace
的情况下,命名空间为SqlFunctions
)。
答案 0 :(得分:0)
有一些Canonical Functions
所有提供商必须支持这些,请参阅:Canonical Functions,但我认为没有Random
规范函数,如果有Random
在列表中,您只需创建CLR Method
并按Random
属性和EdmFunction
Edm
将其映射到NamespaceName
即可,无需创建模型中的UDF
和<function> element
...,如果没有任何Random
规范函数,您可以在概念架构定义语言(CSDL)中创建一个function
元素一个DefiningExpression
元素,并在本节中编写您的语句(可能在TSQL中),而不是在UDF
中定义DataBase
,并定义input parameter
和return type
它,并CRL function
向EdmFunction
发送linq
,并从{{1}}查询来电,请参阅:Call Model-Defined Functions in Queries