【问题标题】:Calling user defined functions in Entity Framework 4在 Entity Framework 4 中调用用户定义的函数
【发布时间】:2011-03-30 20:30:04
【问题描述】:

我在 SQL Server 2005 数据库中有一个用户定义的函数,它返回一点。我想通过实体框架调用这个函数。我一直在四处寻找,但运气不佳。

在 LINQ to SQL 中这非常简单,我只需将函数添加到数据上下文模型中,就可以这样调用它。

bool result = FooContext.UserDefinedFunction(someParameter);

使用实体框架,我已将函数添加到我的模型中,它出现在模型浏览器的 SomeModel.Store\Stored Procedures 下。

模型没有为函数生成代码,.edmx 文件的 XML 包含:

<Function Name="UserDefinedFunction" ReturnType="bit" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
    <Parameter Name="someParameter" Type="int" Mode="In" />
</Function>

我能得到的最接近的是这样的:

bool result = ObjectContext.ExecuteFunction<bool>(
    "UserDefinedFunction",
    new ObjectParameter("someParameter", someParameter)
).First();

但我收到以下错误消息:

函数导入 'UserDefinedFunction' 不能是 在容器“FooEntities”中找到。

为了保护无辜者,改名了。

tldr:如何使用 Entity Framework 4.0 调用标量值用户定义函数?

【问题讨论】:

    标签: c# entity-framework linq-to-entities entity-framework-4


    【解决方案1】:

    我终于解决了:D 对于标量函数,您可以附加 FROM {1} 子句。

    bool result = FooContext.CreateQuery<bool>(
        "SELECT VALUE FooModel.Store.UserDefinedFunction(@someParameter) FROM {1}",
        new ObjectParameter("someParameter", someParameter)
    ).First();
    

    这绝对是在 EF 上使用 LINQ to SQL 的情况。

    【讨论】:

    • 或者您可以只使用只返回一个行值的表值函数。这在很多情况下就足够了。
    【解决方案2】:

    如果你想通过Entity Framework在MS SQL中调用表值函数; 你可以使用这个:

    var retval = db.Database.SqlQuery<MyClass>(String.Format(@"select * from dbo.myDatabaseFunction({0})", id));
    

    【讨论】:

    • 您正在创建列表两次。
    • 这就像描述,但你是对的。我解决了这个问题。
    【解决方案3】:

    调用用户定义的静态类型SQL函数

    你可以使用ExecuteStoreQuery

    • 第一个参数采用字符串格式的SQL函数调用语句
    • 第二个参数采用SqlParameter 类的对象,您可以在其中传递函数参数名称及其值。如下方法所示

    public  string GetNumberOFWorkDays(Guid leaveID)
    {
      using (var ctx  = new INTERNAL_IntranetDemoEntities())
      {
        return ctx.ExecuteStoreQuery<string>(
                      "SELECT [dbo].[fnCalculateNumberOFWorkDays](@leaveID)",
                      new SqlParameter { ParameterName = "leaveID", Value = leaveID }
                   ).FirstOrDefault();
       }
    }
    

    【讨论】:

    • 请详细回答。因为只有基于代码的答案不受欢迎。
    • 这就是我要找的,如何调用用户定义函数
    【解决方案4】:

    使用 ODPNET beta 2 (Oracle) 在 EF4 中调用函数,返回一个 NUMBER:

    using (var db = new FooContext())
    {
        var queryText = "SELECT FooModel.Store.MY_FUNC(@param) FROM {1}"
        var result = db.CreateQuery<DbDataRecord>(queryText,new ObjectParameter("param", paramvalue));
        return result.First().GetDecimal(0);
    }
    

    我在这里添加它是因为根据 Evil Pigeon 的代码,我可以为 Oracle 找出它。 (也赞成他的回答)。

    【讨论】:

      【解决方案5】:

      ObjectResult result = context.ExecuteStoreQuery("select EmployeeName from User where Id = {0}", 15);

      http://msdn.microsoft.com/en-us/library/ee358758.aspx

      【讨论】:

        【解决方案6】:

        您可能会发现this 很有帮助。看来您只能通过 eSQL 直接调用它们,而不能使用 Linq。

        【讨论】:

        • 我在几个小时前发现了那篇文章,文章下方的 cmets 回应了我的沮丧。尽管在排除 FROM 子句(标量函数不需要)时出现语法错误,但我使用 Entity SQL 取得了一些成功。
        【解决方案7】:

        想为遇到此问题的其他人添加注释,如果您的 sql 函数参数可以为空,则必须在 sql 中调用该函数,参数值为“default”。使用实体框架调用类似的函数尝试

        bool result = FooContext.CreateQuery<bool>(
        "SELECT VALUE FooModel.Store.UserDefinedFunction(null) FROM {1}"
        ).First();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-04-17
          • 1970-01-01
          • 1970-01-01
          • 2011-02-07
          • 1970-01-01
          • 1970-01-01
          • 2011-03-22
          • 2020-03-01
          相关资源
          最近更新 更多