我在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:全文查询字符串的全文查询参数无效。
任何人都可以帮助我吗?
由于
答案 0 :(得分:0)
这是字符串长度的问题。 您有2个选择:
@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 +"')");