Общее выражение для поиска частичных совпадений строк с динамическим списком полей в запросе LINQ.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Общее выражение для поиска частичных совпадений строк с динамическим списком полей в запросе LINQ.

Сообщение Anonymous »

Насколько я понимаю, в частности, с SQL Server:
  • Запросы LINQ преобразуют код запроса в T-SQL для выполнения на SQL Server.< /li>
    Логика кода LINQ не всегда легко преобразуется в T-SQL, поэтому обычно требуются дополнительные шаги, чтобы заставить логику кода работать. Пример: добавление .ToList() к вызову таблицы контекста приведет к извлечению всех записей в память, к которой может обращаться остальная часть кода, генерирующего T-SQL.
В этом последнем пункте мне нужна помощь. Позвольте мне начать с цели, которую я пытаюсь достичь. Я хочу иметь возможность создать общий метод, который можно будет вызывать из запроса LINQ, передавая список полей таблицы и список строковых значений, который будет возвращать true или false, если какое-либо из строковых значений частично найдено в любое из полей таблицы. У меня есть следующий метод, который я использую и который сейчас работает:

Код: Выделить всё

    public static bool SearchTermMatch(List t, List f)
{
return
(
(t.Count() == 0) ||
(t.Count(_t => f.Any(_f => _f != null && _f.ToLower().Contains(_t.ToLower())) || _t == "") == t.Count())
);
}
Я могу назвать это, например, так:

Код: Выделить всё

var terms = "Tom Jones";
var termlist = (string.IsNullOrEmpty(terms)) ? new List() : terms.Split(' ').ToList();
var results = (from tbl in context.MyTable.ToList() where SearchTermMatch(termlist, new List() { tbl.Field1, tbl.Field2, tbl.Field3 }) select new { tbl.Field1 }).Take(10).ToList();
Как я уже упоминал выше, это работает, но только потому, что мне нужно применить .ToList() к таблице контекста. Однако за то, как это работает, есть цена, которую я не хочу брать на себя. По сути, все записи в MyTable переносятся в память, а остальная часть метода SearchTermMatch применяется к результатам в памяти. Это становится очень затратным, когда MyTable имеет сотни тысяч записей, поскольку для каждой записи в MyTable SearchTermMatch сравнивает ЗНАЧЕНИЯ Field1, Field2 и Field3 со списком строк, в которых я ищу частичные совпадения. Таким образом, по сути, T-SQL работает быстро, возвращая ВСЕ записи из MyTable в память сервера, где остальная часть LINQ обрабатывает результирующие значения полей для каждой записи по списку строк из памяти сервера. Это неэффективно.
Я считаю, что ответ заключается в преобразовании метода SearchTermMatch в выражение, которое создаст поля таблицы, сравниваемые со списком строк, в T-SQL, который можно выполнить с помощью запрос MyTable. По сути, цель состоит в том, чтобы метод SearchTermMatch возвращал T-SQL в запрос LINQ, чтобы я мог избавиться от дополнения .ToList(), занимающего память. Я просто хочу, чтобы мой LINQ полностью выполнялся на SQL Server.
Есть ли у кого-нибудь предложения о том, как мне следует к этому подойти? Я пытался осмыслить концепцию выражений и чувствовал, что это именно то направление, в котором мне нужно двигаться, но мне трудно понять, как собрать альтернативный метод SearchTermMatch.Спасибо за любую помощь.

Подробнее здесь: https://stackoverflow.com/questions/784 ... -of-fields
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»