在Entity Framework 4中调用用户定义函数

22

我在 SQL Server 2005 数据库中有一个返回 bit 类型的自定义函数。我想通过 Entity Framework 调用这个函数。我已经搜索了一下,但没有找到太多有用的信息。

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

bool result = FooContext.UserDefinedFunction(someParameter);

使用Entity Framework,我已经将函数添加到了我的模型中,并且它出现在模型浏览器的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();

但我收到了以下错误信息:

在容器'FooEntities'中找不到名为“UserDefinedFunction”的函数导入。

姓名已更改以保护无辜者。

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

7个回答

23

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

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

在这种情况下,使用LINQ to SQL比EF更合适。


1
或者你可以使用一个返回单行值的表值函数,这在许多情况下已经足够了。 - devinbost

8
如果您想通过Entity Framework调用MS SQL中的表值函数; 您可以使用以下方法:
var retval = db.Database.SqlQuery<MyClass>(String.Format(@"select * from dbo.myDatabaseFunction({0})", id));

你正在创建两次列表。 - Dave
就像描述一样,但你是对的。我已经修复了这个问题。 - Oguzhan Kircali

7

调用用户定义的静态类型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();
   }
}


请详细说明您的答案。因为仅有基于代码的答案是不被赞赏的。 - Sulthan Allaudeen
这就是我要找的,如何调用用户定义的函数。 - saqibahmad

5

使用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找到答案。(也给他点了赞)。


3

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

我几个小时前发现了那篇文章,文章下面的评论反映了我的沮丧情绪。我使用实体SQL取得了一些成功,尽管当我排除FROM子句时(对于标量函数不需要),会出现语法错误。 - Evil Pigeon

0

我想为其他遇到这个问题的人添加一条注释,如果你的 SQL 函数参数可为空,那么在 SQL 中调用该函数时必须使用参数值 "default"。要使用 Entity Framework 调用这样的函数,请尝试以下方法:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接