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

时间:2012-01-10 23:28:53

标签: mysql entity-framework linq-to-entities

我正在使用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)。

1 个答案:

答案 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 parameterreturn type它,并CRL functionEdmFunction发送linq,并从{{1}}查询来电,请参阅:Call Model-Defined Functions in Queries