2016-11-18 4 views
0

В LINQ я пытаюсь выполнить пользовательскую функцию внутреннего соединения, написанную для полнотекстового поиска, и результат Iqueryable.SQL: Вложенный запрос не имеет соответствующего ключа

Однако, я получаю следующее сообщение об ошибке при попытке to_ret.select(--something--).ToList()

Вложенный запрос не имеет соответствующего ключа

LINQ Код:

var sql_query = db.search(st); 
    var to_ret = from ts in sql_query 
       from t in table 
       where t.Id == ts.Value select t; 

    to_ret = to_ret.Include(x => x.table1) 
       .Include(x=> x.table2.Select(y=> y.table2Col)); 

    to_ret.select(-something-).toList(); 

SQL код:

create function [dbo].[search] 
     (@keywords nvarchar(4000)) 
returns table 
as 
    return (
    select [key] from containstable(tb,(Name,Description),@keywords) 
) 

код, который работает на месте выше LINQ Код:

var ids = (from t in table join ts in db.search(st) on t.Id equals ts.Value select t.Id).ToList(); 

to_ret = to_ret.Where(x => ids.Contains(x.Id)); 

Однако код, который работает недостаточно эффективно, как он жадно загружает все ids для сравнения

ответ

0

Не присоединиться к таблице с помощью LINQ , это не эффективно.

Вам необходимо включить все объединенные функции в функцию [dbo]. [Search] table valued function (как вид). Затем просто вызовите [dbo]. [Поиск] из EF и отфильтруйте его.

У меня есть mentioned присоединился к полнотекстовой таблице ценной функции здесь.

Обратите внимание, что полный текст и фильтрация в одном запросе могут занять много времени, поскольку это непростая задача для оптимизатора запросов. Оптимизатор запросов выбирает для выполнения первого полного текста на всей таблице (таблицах), а затем фильтрации или наоборот.

Смежные вопросы