Могу ли я передать IQueryable <> в табличную функцию? - PullRequest
2 голосов
/ 01 октября 2010

У меня есть что-то вроде следующей таблицы для поиска текста:

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 мс.

1 Ответ

0 голосов
/ 10 августа 2011

Вы можете присоединиться к своей функции 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';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...