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

时间:2010-08-17 08:10:28

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

我在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();

但是我收到以下错误消息:

  

FunctionImport   'UserDefinedFunction'不可能   在容器'FooEntities'中找到。

名称已被更改以保护无辜者。

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

6 个答案:

答案 0 :(得分:22)

我终于解决了: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的一种情况。

答案 1 :(得分:6)

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

答案 2 :(得分: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解决这个问题。 (也赞成他的回答)。

答案 3 :(得分:3)

ObjectResult result = context.ExecuteStoreQuery(“从用户中选择EmployeeName,其中Id = {0}”,15);

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

think id为其他任何人添加一个注释,如果你的sql函数参数可以为空,你必须在sql中调用参数值为&#34; default&#34;。要使用Entity Framwork调用类似函数,请尝试

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