2010-10-01 59 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'; 
相關問題