2010-10-01 87 views
2

我有事如下表像来搜索一些文字:我可以将IQueryable <>传递给表值函数吗?

SearchedTextTable 
Id int primary key 
Text nvarchar(max) 
Code int 

文字是全文索引的,所以我做了如下表值函数与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

您可以加入到您的SearchText函数或以其他方式在WHERE子句中使用它。我不确定linq-to-sql的语法。

如果您将函数从多语句表值函数更改为内联表值函数,那会更好一些,因为查询优化器可以更好地优化它。内联表值函数的工作方式就好像它是一个接受参数的视图。

ALTER FUNCTION [dbo].[SearchText] (@keywords nvarchar(4000)) 
RETURNS TABLE 
RETURN 
SELECT Id 
FROM SearchedTextTable 
WHERE contains(Text,@keywords); 

所以,你希望你的LINQ到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'; 
相关问题