- Запросы LINQ преобразуют код запроса в T-SQL для выполнения на SQL Server.< /li>
Логика кода LINQ не всегда легко преобразуется в T-SQL, поэтому обычно требуются дополнительные шаги, чтобы заставить логику кода работать. Пример: добавление .ToList() к вызову таблицы контекста приведет к извлечению всех записей в память, к которой может обращаться остальная часть кода, генерирующего T-SQL.
Код: Выделить всё
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();
Я считаю, что ответ заключается в преобразовании метода SearchTermMatch в выражение, которое создаст поля таблицы, сравниваемые со списком строк, в T-SQL, который можно выполнить с помощью запрос MyTable. По сути, цель состоит в том, чтобы метод SearchTermMatch возвращал T-SQL в запрос LINQ, чтобы я мог избавиться от дополнения .ToList(), занимающего память. Я просто хочу, чтобы мой LINQ полностью выполнялся на SQL Server.
Есть ли у кого-нибудь предложения о том, как мне следует к этому подойти? Я пытался осмыслить концепцию выражений и чувствовал, что это именно то направление, в котором мне нужно двигаться, но мне трудно понять, как собрать альтернативный метод SearchTermMatch.Спасибо за любую помощь.
Подробнее здесь: https://stackoverflow.com/questions/784 ... -of-fields