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

Evi*_*eon 21 c# linq-to-entities entity-framework entity-framework-4

我在SQL Server 2005数据库中有一个用户定义的函数,它返回一个位.我想通过实体框架调用此函数.我一直在寻找,并没有太多运气.

在LINQ to SQL中,这很简单,我只是将函数添加到Data上下文模型中,我可以像这样调用它.

bool result = FooContext.UserDefinedFunction(someParameter);
Run Code Online (Sandbox Code Playgroud)

使用实体框架,我已将该函数添加到我的模型中,它出现在模型浏览器中的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>
Run Code Online (Sandbox Code Playgroud)

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

bool result = ObjectContext.ExecuteFunction<bool>(
    "UserDefinedFunction",
    new ObjectParameter("someParameter", someParameter)
).First();
Run Code Online (Sandbox Code Playgroud)

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

无法在容器'FooEntities'中找到FunctionImport'UserDefinedFunction'.

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

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

Evi*_*eon 22

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

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

这绝对是使用LINQ to SQL over EF的情况.


Sac*_*rma 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();
   }
}
Run Code Online (Sandbox Code Playgroud)


Ogu*_*ALI 6

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

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


小智 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);
}
Run Code Online (Sandbox Code Playgroud)

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