我可以通过IQueryable<>表值函数?

时间:2010-10-01 02:17:42

标签: sql-server linq-to-sql

我有类似下表的内容来搜索某些文字:

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毫秒。

1 个答案:

答案 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生成一些类似于:

的SQL
SELECT ... 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';