我有类似下表的内容来搜索某些文字:
SearchedTextTable
Id int primary key
Text nvarchar(max)
Code int
Text是全文索引的,所以我使用下表值函数来使用LinqToSQL:
ALTER FUNCTION [dbo].[SearchText] (@keywords nvarchar(4000))
returns @results table (Id int not null)
as
begin
INSERT @results
SELECT
Id
from SearchedTextTable
where contains(Text,@keywords)
return;
end;
我想要做的是在搜索文本之前应用一些条件,如下面的代码:
注意:条件实际上有点复杂,所以我不想将它们放入表值函数中。
using(var contetxt= new FooDataContext())
{
var list = context.SearchedTextTable.Where(x => x.Code==code);
var results = context.SearchText(list, keywords).ToList();
}
SearchText函数应如下所示:
ALTER FUNCTION [dbo].[SearchText] (@table table, @keywords nvarchar(4000))
returns @results table (Id int not null)
as
begin
INSERT @results
SELECT
Id
from @table
where contains(Text,@keywords)
return;
end;
这可能吗?如果是这样你能告诉我怎么样?
提前致谢,
柳
修改
经过一些测试后,即使我在进行全文搜索之前设置了一些条件,性能似乎也没有受到任何影响。它们都返回不到10毫秒。
答案 0 :(得分:0)
您可以加入SearchText函数或以其他方式在WHERE子句中使用它。我不确定linq-to-sql的语法。
如果将函数从多语句表值函数更改为内联表值函数,它会更好一点,因为查询优化器将能够更好地优化它。内联表值函数就像是一个接受参数的视图一样工作。
ALTER FUNCTION [dbo].[SearchText] (@keywords nvarchar(4000))
RETURNS TABLE
RETURN
SELECT Id
FROM SearchedTextTable
WHERE contains(Text,@keywords);
所以你希望你的linq-to-sql生成一些类似于:
的SQLSELECT ... FROM SearchedTextTable
WHERE code = 'x' AND Id IN (SELECT Id FROM SearchText('keyword'));
或
SELECT ... FROM SearchedTextTable AS A
JOIN dbo.SearchText('keyword') AS B ON A.Id = B.Id
WHERE A.code = 'x';