Как искать поле varchar, используя LINQ, для построения списка рекомендаций - PullRequest
1 голос
/ 05 мая 2009

Я пытаюсь создать запрос LINQ с деревьями выражений, чтобы сделать следующее:

В моей таблице ItemCode есть поле с именем Labels, примером данных, содержащихся в этом поле, является "лампа освещения люстры".

Я хочу разрешить пользователю вводить какой-то текст, то есть «Красная лампа», и иметь возможность поиска в поле «Ярлыки» в ItemCode, в таблице, где текст содержит «Красный» или «Лампа».

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

Я использую CSLA в качестве моей платформы, вот пример кода, который у меня сейчас есть:

IQueryable<Data.ItemCode> query = ctx.DataContext.ItemCodes;

//
// ItemCodeId
//
if (criteria.Name != null)
     query = query.Where(row => row.ItemCodeId.Contains(criteria.ItemCodeId));
//
// Name
//
if (criteria.Name != null)
     query = query.Where(row => row.Name.Contains(criteria.Name));

var data = query.Select(row => ItemCodeInfo.FetchItemCodeInfo(row));

this.AddRange(data);

Заранее спасибо!

Ответы [ 4 ]

1 голос
/ 04 июля 2009
1 голос
/ 05 мая 2009

РЕДАКТИРОВАТЬ: Обновлено, чтобы отразить ваш пример кода

Предполагается, что у вашего объекта Criteria есть поле с именем Labels, которое является строкой поиска (например, «Красная лампа»):

var rows = query.ToList() // work around for local sequences error
           .Where(row => row.Labels.Split(' ')
                         .Intersect(Criteria.Labels.Split(' '))
                         .Count()>0);
this.AddRange(rows);

Это выберет строки, в которых поле меток содержит любое из слов в строке поиска критерия. Предполагается, что слова разделены пробелами как в поле «Метки», так и в строке критериев. Он не будет выполнять частичное сопоставление слов, например, он не найдет запись с меткой «redlamp», если в строке поиска указано «red lamp»

0 голосов
/ 15 ноября 2009

Мы решили, что вы пройдете маршрут хранимой процедуры для этого расширенного функционала Спасибо всем за участие!

0 голосов
/ 05 мая 2009
String searchString = "red LAMP";

String[] searchStringParts = searchString.
   ToUpperInvariant().
   Split(new Char[] {' '}, StringSplitOptions.RemoveEmptyEntries);

IEnumerable<ItemCode> resultSet = itemCodes.
   Where(itemCode => searchStringParts.
      Any(part => itemCode.Labels.ToUpperInvariant().Contains(part)));

Это будет работать с LINQ to Object. Может быть не с LINQ to SQL из-за вызова ToUpperInvariant(). В этом случае вы можете пропустить нормализацию (из-за плохого качества поиска) или сохранить нормализованные метки. Или вы можете добавить вызов ToList(), получить все элементы и выполнить обработку на клиентском компьютере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...