【问题标题】:Using SqlFunctions or Equivalent Collection of EdmFunctions with MySql and Entity Framework在 MySql 和实体框架中使用 SqlFunctions 或 EdmFunctions 的等效集合
【发布时间】: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 函数更直接可用(也许通过正确设置 EdmFunctionNamespace 属性(在这种情况下) SqlFunctions 的命名空间是 "SqlServer")。

【问题讨论】:

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


【解决方案1】:

有一些Canonical Functions,所有的提供者都必须支持这些,看这个:Canonical Functions,但我想没有Random规范函数,如果列表上有Random,你可以简单创建CLR Method 并通过EdmFunction 属性和Edm NamespaceName 将其映射到Random,并且无需在您的模型中创建UDF<function> element...,如果没有任何Random 规范函数,您可以在概念模式定义语言(CSDL)中创建一个包含DefiningExpression 元素的function 元素,并在本节中编写您的语句(可能在TSQL 中),而不是在本节中定义UDF DataBase,并为其定义 input parameterreturn type,并通过 EdmFunctionCRL function 映射到它,并从 linq 查询中调用,请参见:Call Model-Defined Functions in Queries

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    相关资源
    最近更新 更多