Linq-to-Sql с несколькими содержит - PullRequest
0 голосов
/ 06 апреля 2019

Запрос ниже представляет собой простой запрос с несколькими условиями ИЛИ, и в основном он ищет, содержится ли searchString в каком-либо из трех включенных полей: ItemID, ItemID2 или ItemDescription.Если searchString равен "3/4 pipe", он будет возвращать только те записи, которые содержат "3/4 pipe".Мне нужно, чтобы он возвращал записи, которые содержат как "3/4", так и "труба", чтобы такие записи, как "3/4 стальная труба" или "3/4 медная труба" или "труба для 3/4 провода", были включены.По сути, значения результата должны включать оба слова в searchString.«3/4 copper» или «copper pipe» возвращаться не будут, так как ни один из них не содержит ни «3/4», ни «pipe».

И для дополнительной забавы searchString может иметь любойчисло слов.

IEnumerable<Item> query = from item in context.Items
                                  where item.ItemID.ToUpper().Contains(searchString) ||
                                  item.ItemID2.ToUpper().Contains(searchString) ||
                                  item.ItemDesc.ToUpper().Contains(searchString)
                                  orderby item.ItemClassID, item.ItemID ascending
                                  select item;
        return query.ToList();

1 Ответ

0 голосов
/ 06 апреля 2019

Очевидно, что разделитель в вашем searchString является пробелом. Поэтому сначала вам нужно разделить searchString на массив строк:

var searchStringList = searchString.Split(' ');

Затем вы можете проверить, содержит ли какой-либо из указанных столбцов все элементы в списке строк, например:

searchStringList.All(x => item.ItemID.ToUpper().Contains(x))

Наконец-то это будет примерно так:

var searchStringList = searchString.Split(' ');

IEnumerable<Item> query = from item in context.Items
                                  where searchStringList.All(x => item.ItemID.ToUpper().Contains(x)) ||
                                  searchStringList.All(x => item.ItemID2.ToUpper().Contains(x)) ||
                                  searchStringList.All(x => item.ItemDesc.ToUpper().Contains(x))
                                  orderby item.ItemClassID, item.ItemID ascending
                                  select item;
        return query.ToList();

Обновление
Как и в вашем комментарии, приведенный выше код жалуется на то, что локальная последовательность (searchStringList) не может использоваться в LINQ to SQL.
Одним из решений, которое я могу предложить для этого, является использование ToList(), чтобы сначала получить все записи таблицы в памяти, а затем выполнить поиск по объекту. Однако следует помнить, что у него есть проблемы с производительностью.

var searchStringList = searchString.Split(' ');

IEnumerable<Item> query = from item in context.Items.ToList()
                                  where searchStringList.All(x => item.ItemID.ToUpper().Contains(x)) ||
                                  searchStringList.All(x => item.ItemID2.ToUpper().Contains(x)) ||
                                  searchStringList.All(x => item.ItemDesc.ToUpper().Contains(x))
                                  orderby item.ItemClassID, item.ItemID ascending
                                  select item;
        return query.ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...