Linq to sql запросов нескольких столбцов - справка по запросу - PullRequest
0 голосов
/ 09 сентября 2011

У меня есть текстовое поле на экране, где пользователи могут искать несколько вещей из одного поля ввода:

  1. Адрес
  2. Почтовый индекс
  3. Имя клиента
  4. ID * +1010 *

Как лучше написать запрос, который будет запрашивать эти столбцы?

Как мне принять ввод, разделить ли строку на пробел? или запятая?

Пользовательский ввод = 67 горшков переулок 99
где "67 pottors lane" является адресом
«99» это / может быть ID

Что у меня так далеко:

//q = querystring
//filteredlist = extension method for the table that I am querying
//clientlist = list of clients I have passed in as a param

// Вот мой запрос для

if (!string.IsNullOrEmpty(q))
{
  var result = q.Trim();
   filteredlist = filteredlist
   .Where(x => x.ID.Contains(q) || x.SubjectPropertyAddress1.Contains(q)
   || x.SubjectPropertyPostCode.Contains(q)
   || clientlist.Any(y=> x.ClientID == y.ClientID && (y.ID.Contains(q) || y.Name.Contains(q))  ));
}

ПРИМЕЧАНИЕ. Я буду использовать индексирование с использованием sql.

Ответы [ 3 ]

1 голос
/ 09 сентября 2011

Возможно, идея: создайте дополнительный столбец в вашей базе данных со всеми столбцами, которые вы хотите найти, как одну большую объединенную строку.Затем выполните свободный текстовый поиск вашей входной строки по сравнению с этим полем в БД.

Поскольку L2SQL не поддерживает поиск в свободном тексте, в этом случае вам нужно сделать это в хранимой процедуре или сделать как здесь (/51788/linqtosql-i-polnotekstovyi-poisk-eto-mozhno-sdelat)

0 голосов
/ 09 сентября 2011

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

Я придумал что-то вроде следующего:

string[] words = q.ToLower().Split(' ');
string[] wordsFixed = new string[] {"", "", "", "", "", "" };

for(int i = 0; i < 6 && i < words.Length; i++)
    wordsFixed[i] = words[i];

    var data = from item in list
                    where (item.ID + item.Name + item.Address1 + item.Address2 + item.PostCode).ToLower().Contains(wordsFixed[0]) &&
                          (item.ID + item.Name + item.Address1 + item.Address2 + item.PostCode).ToLower().Contains(wordsFixed[1]) &&
                          (item.ID + item.Name + item.Address1 + item.Address2 + item.PostCode).ToLower().Contains(wordsFixed[2]) &&
                          (item.ID + item.Name + item.Address1 + item.Address2 + item.PostCode).ToLower().Contains(wordsFixed[3]) &&
                          (item.ID + item.Name + item.Address1 + item.Address2 + item.PostCode).ToLower().Contains(wordsFixed[4]) &&
                          (item.ID + item.Name + item.Address1 + item.Address2 + item.PostCode).ToLower().Contains(wordsFixed[5])
                    select item;
0 голосов
/ 09 сентября 2011

Ох, нет ли способа разделить ввод на отдельные поля для идентификатора, адреса, почтового индекса и имени?

Если это так, вы можете продолжать добавлять предложения Where, например

var query = filteredList;
if (!String.IsNullOrEmpty(id))
{
    query = query.Where(c => c.ID.Contains(id))
}
if (!String.IsNullOrEmpty(name))
{
    query = query.Where(c => c.Name.Contains(name))
}

.. то же самое для имени, адреса и т. Д.

В противном случае ваш запрос больше напоминает запрос поисковой системы, чем запрос СУБД.

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