【发布时间】:2023-03-09 06:01:01
【问题描述】:
我已经寻找了几天的解决方案,但找不到。
我正在创建一个存储过程来使用全文搜索来搜索表。然后,我会将其中 15 个存储过程的结果组合成一个按其排名排序的列表。
这是存储过程的代码:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[SpAdvancedSearchICAPUsers]
@searching nvarchar(100) = ''
AS
BEGIN
SET NOCOUNT ON;
Set FMTONLY OFF;
DECLARE @SQLQuery AS NVarchar(max)
IF @searching IS NULL OR @searching = ''
BEGIN
SET @SQLQuery = 'SELECT (all field names listed separated by commas) FROM Users'
END
ELSE
BEGIN
SET @SQLQuery = 'SELECT (all field names listed separated by commas), fts.Rank FROM Users as p JOIN
FREETEXTTABLE(Users, (fields to search for listed separated by commas), @searching)
as fts on p.userID = fts.[KEY] WHERE 1=1'
END
EXEC @SQLQuery
END
我确实是先做模型来接触这个项目的。我通过右键单击并按下将我的存储过程添加到我的模型中:Add New > Function Import...
我设置了函数导入的名称,选择了存储过程,选择了“返回集合”到实体:(SP返回的所需数据类型,在本例中为用户)。
当我像这样使用存储过程时:
newSearch.Users = db.SpAdvancedSearchICAPUsers(search); //search is a string
newSearch.Users 是一个IENumerable<Users>。它说返回类型是存储过程的 int。我收到以下错误:
无法将类型“int”隐式转换为“System.Collections.Generic.IEnumerable”;
我还尝试在声明@SQLQuery 的下方添加一个参数定义变量,如下所示:
Declare @ParamDefinition As NVarchar(4000)
然后我设置它并尝试像这样运行它:
Set @ParamDefinition = '@searchingnvarchar(100)'
Exec sp_executesql @SQLQuery, @ParamDefinition, @searching
@searching 是传入搜索的字符串。
我什至尝试将我所有的表拖到一个 DBML 文件中,因为我以前曾以这种方式成功地使用过存储过程。当我将 SP 拖到表格中时,我收到以下消息:
UPDATE:Eddie在cmets中指定,在DBML中你拖入存储过程后,可以设置返回类型(我选择了User对象类型)。这行得通。我宁愿不这样做。我将它作为一个临时解决方案,但我有 15 个存储过程我必须这样做。
有谁知道如何使用 EDMX 文件而不是 DBML 从存储过程中获取正确的输出?当我右键单击 EDMX 并选择“映射详细信息 > 存储过程/函数”后查看属性时。 EDMX 中的返回类型没有任何内容。它没有下拉列表,什么都没有。
【问题讨论】:
-
您是否尝试在“属性”窗口中设置存储过程的返回类型? :P 不是试图屈尊,但这就是错误所说的,你没有提到尝试它。
-
存储过程的属性没有让我设置返回类型的地方。我不确定他们指的是实际设置的位置。我找过,到处都找不到。
-
而且...我刚刚找到它...哇...哇。我真的到处寻找它,当你提到它时找到它。通过 make it 更改返回类型,因此我得到了一个列表,该列表有效,感谢您指出这一点并使我看起来更深入。有没有办法在不使用 LINQ 和 DBML 的情况下做到这一点?我不想对我拥有的每一个存储过程都这样做(大约有 15 个)。这是一个很好的临时解决方案,但我想在不使用 LINQ 或 DBML 文件的情况下解决问题,只使用 EF6 和我的 EDMX。
-
请您详细说明一下?我刚刚花了一个小时试图解决这个问题。最后,我使用虚拟 SQL 生成带有正确 cmets 的 select 语句,然后将其注释掉以恢复为正确的 SQL。我确定您的解决方案可以解决我的问题,但我不明白!顺便说一句,另一个不起作用的“解决方案”是使用中间 CTE 或临时表(即使添加了 SET FMTONLY OFF)。
标签: c# sql-server asp.net-mvc-5 .net-4.5 entity-framework-6