Моя цель: Я построил работающее действие контроллера в 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 создаю расширение, которое разбивает запросы на управляемые блоки.Но я не могу понять, как это реализовать.Может быть, из моей глубины сейчас?
Есть другой подход, который я пропускаю?Какой-то более простой способ сделать это, что я упустил?
Извините за длинный пост.Но спасибо за любую помощь, которую вы можете оказать!