在实体框架中呼叫TVF

时间:2013-12-06 14:55:16

标签: c# sql sql-server entity-framework

我在SQL Server中有一个表值函数,我想从EF调用它。

SQL Server代码:

CREATE FUNCTION fn_SearchTitle(@q AS NVARCHAR(50))
RETURNS TABLE
AS
   RETURN
   (SELECT * FROM Advertise
    WHERE FREETEXT([Title], @q));

在SQL Server中,一切正常,但在实体框架中却没有。

我使用数据库优先方法创建一个实体并导入表值函数。现在我想要使用这个函数:

using (var context = new testEntities())
{
   var res = context.fn_SearchTitle("iphone");

   foreach (var result in res)
   {
      Console.WriteLine(result.Title);
   }
}

此代码抛出此异常:

  

mscorlib.dll中出现未处理的“System.Data.Entity.Core.EntityCommandExecutionException”类型异常

详细说明: 全文查询字符串的全文查询参数无效。

异常详细信息:System.Data.SqlClient.SqlException:全文查询字符串的全文查询参数无效。

任何人都可以帮助我吗?

由于

1 个答案:

答案 0 :(得分:0)

这是字符串长度的问题。 您有2个选择:

  1. 修改您的功能。参数@q必须为varchar(MAX)。然后 您必须使用另一个变量NVARCHAR(50)来强制转换。您的函数必须如下所示:

CREATE FUNCTION fn_SearchTitle(@q AS NVARCHAR(50))
RETURNS @auxTable TABLE (AdvertiseID int, Title nvarchar(50))
BEGIN
   DECLARE @auxQ varchar(150) = Convert(varchar(150), @q)
       INSERT INTO @auxTable 
       SELECT AdvertiseID,Title FROM Advertise
       WHERE FREETEXT([Title], @auxQ);
   RETURN
END

2-修改您的EF功能:

return ((IObjectContextAdapter)this).ObjectContext.CreateQuery<YourType>("[YourEntities].[fn_SearchTitle]('" + q +"')");