Запрос Linq-to-SQL - Требуется фильтровать по идентификаторам, возвращаемым полнотекстовым поиском функций sql - Предел попадания для Contains - PullRequest
0 голосов
/ 22 декабря 2010

Моя цель: Я построил работающее действие контроллера в MVC, которое принимает пользовательский ввод для различных критериев фильтрации и, используя PredicateBuilder (часть LinqKit - извините, я непока разрешено достаточно ссылок) создает соответствующий запрос LINQ для возврата строк из «главной» таблицы в SQL с несколькими сотнями тысяч записей.Моя реализация предикатов совершенно не элегантна, поскольку я новичок во многих из них, и в очень сжатые сроки, но это действительно облегчило жизнь.Страница работает как есть.

Для этого мне нужно добавить фильтр полнотекстового поиска.Понимание того, как LINQ переводит Содержит в LIKE (%%), используя советы из Блог Саймона: LINQ-to-SQL - Включение полнотекстового поиска , я уже подготовил функции таблиц в SQL для запуска Freetextзапросы по соответствующим столбцам.У меня есть 4 функции, чтобы сопоставить запрос с 4 отдельными таблицами.

Мой подход: В данный момент я создаю предикаты (я вас пощадю) для исходного объекта данных IQueryable, запускаю команду LINQ для их возврата, например так:

var MyData = DB.Master_Items.Where(outer);

Затем я пытаюсь дополнительно отфильтровать MyData по ключам, возвращенным моими функциями полнотекстового поиска:

var FTS_Matches_Subtable_1 = (from tbl in DB.Subtable_1
                              join fts in DB.udf_Subtable_1_FTSearch(KeywordTerms)
                              on tbl.ID equals fts.ID
                              select tbl.ForeignKey);

... У меня есть 4 из этих наборовсовпадения, которые я пытался использовать для фильтрации моего исходного набора данных несколькими способами, но безуспешно.Например:

MyNewData = MyData.Where(d => FTS_Matches_Subtable_1.Contains(d.Key) ||
                              FTS_Matches_Subtable_2.Contains(d.Key) || 
                              FTS_Matches_Subtable_3.Contains(d.Key) || 
                              FTS_Matches_Subtable_4.Contains(d.Key));

Я просто получаю сообщение об ошибке: Неверный поток протокола удаленного вызова процедур (RPC) входящего потока табличных данных (TDS).Слишком много параметров было предоставлено в этом запросе RPC.Максимум - 2100.

Я понял, что это потому, что я пытаюсь передать относительно большой набор данных в функцию Contains, а LINQ преобразует каждую запись в отдельный параметр, превышающий ограничение.

Я просто не знаю, как обойти это.

Я нашел еще одно выражение linq для возврата значения свойства , которое казалось НАСТОЛЬКО многообещающим.Я попробовал решение ifwdev (2-е место с самым высоким рейтингом): с помощью LinqKit создаю расширение, которое разбивает запросы на управляемые блоки.Но я не могу понять, как это реализовать.Может быть, из моей глубины сейчас?

Есть другой подход, который я пропускаю?Какой-то более простой способ сделать это, что я упустил?

Извините за длинный пост.Но спасибо за любую помощь, которую вы можете оказать!

1 Ответ

0 голосов
/ 22 декабря 2010

Это идеальное время, чтобы вернуться к raw ado.net.

Свернуть все вокруг, просто используя linq to sql, вероятно, так же много времени, если вы написали запрос и гидратацию вручную.

...