使用SqlFunctions或EdmFunctions的等效集合与MySql和Entity Framework

Pau*_*ler 6 mysql linq-to-entities entity-framework

我正在使用Linq to Entities,由MySql支持.我希望能够使用各种内置的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();
Run Code Online (Sandbox Code Playgroud)

然后我从数据库更新我的模型(我使用.ebmx),并创建一个静态类,如下所示:

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

这允许我在我的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);
}
Run Code Online (Sandbox Code Playgroud)

所以,问题是,我可以做到这一点,而无需创建愚蠢的包装UDF,只是让所有的内置可更直接MySQL的函数(也许通过设置EdmFunctionNamespace正确属性(在的情况下,SqlFunctions命名空间"SqlServer").

Ami*_*ian 0

有一些Canonical Functions所有提供者都必须支持这些,请参阅:Canonical Functions,但我猜没有规范函数,如果列表中Random有,您可以简单地创建并通过属性 和映射它,并且没有需要在您的模型中创建一个and ... ,如果没有任何规范函数,您可以使用概念模式定义语言(CSDL)创建一个包含元素的元素,并在本节中编写您的语句(可能在 TSQL 中),不要在 中定义、为它定义和,然后将by映射到它,然后从查询中调用,请参阅:在查询中调用模型定义的函数RandomCLR MethodRandomEdmFunctionEdm NamespaceNameUDF<function> elementRandomfunctionDefiningExpressionUDFDataBaseinput parameterreturn typeCRL functionEdmFunctionlinq