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

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

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

bool result = FooContext.UserDefinedFunction(someParameter); 

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

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

    

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

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

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

无法在容器’FooEntities’中找到FunctionImport’UserDefinedFunction’。

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

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

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

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

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

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

你可以使用ExecuteStoreQuery

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

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

使用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(queryText,new ObjectParameter("param", paramvalue)); return result.First().GetDecimal(0); } 

我在这里添加它是因为基于Evil Pigeon的代码我可以为Oracle解决这个问题。 (也赞成他的回答)。

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

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

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

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

您可能会觉得这很有帮助。 您似乎只能通过eSQL直接调用它们而不使用Linq。

think id为其他任何遇到这个的人添加一个注释,如果你的sql函数参数是可空的,你必须在参数值为“default”的sql中调用该函数。 要使用Entity Framwork调用这样的函数,请尝试

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