Member 12115746 Ответов: 1

Поиск по одному и нескольким ключевым словам как из одного текстового поля


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

Пожалуйста, кто-нибудь мне поможет, заранее спасибо

Что я уже пробовал:

var db = new MatriModel();
string s = txtKeyWord.Text;
string[] words = s.Split(',');
int count = words.Length;

if (count <= 5))
{
    SerachByKeyWordPanel.Visible = true;
    var KeyWord = db.tblProfiles.Where(x => words.Contains(x.tblCaste.Caste) && words.Contains(x.tblCountry.Country) && words.Contains(x.City) && words.Contains(x.tblOccupation.Occupation) && words.Contains(x.tblMotherTongue.MotherTongue)).Select(x => new
  {
        ProfileID = x.ProfileID,
        ProfileFor = x.tblProfileFor.ProfileFor,
  }.ToList();

Philippe Mori

Если вы хотите искать конкретные вещи, то было бы лучше отобразить 5 полей на веб-странице и отфильтровать данные соответствующим образом в зависимости от того, какое поле было заполнено.

Вы не ясно объяснили проблему с вашим кодом... Возможно, при первом чтении не всем будет очевидно, что ваш код не сможет найти элемент, как только в словах пропадет одна информация (каста, страна, город...).

Member 12115746

Поиск по ключевым словам,таким как город,страна, Каста с одним текстовым полем работает с моим приведенным выше кодом, но с тем же кодом, если я ищу с одним ключевым словом ex: city, то он показывает мне "нет записи найдено".

Нужно получить записи с несколькими ключевыми словами поиска, а также одно ключевое слово

Philippe Mori

Как я уже сказал, если одна информация отсутствует, вы не найдете запись, потому что вы фильтруете по всем полям.

Хотя если пользователь введет одну-единственную информацию, то использовать ее будет тривиально || вместо && чтобы он мог соответствовать любому полю, он не будет хорошо работать, если пользователь хочет ввести несколько сведений, но не все.

Возможно, вы сможете подсчитать количество совпадений, но тогда запрос, вероятно, станет слишком сложным, и он может потерпеть неудачу или быть очень медленным.

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

Ну, если данные действительно малы (скажем, не более 100 записей максимум), вы можете выполнить фильтрацию в памяти (и не ограничиваться сложностью SQL-запроса).

1 Ответов

Рейтинг:
2

Maciej Los

Вместе с Where вы должны использовать Какой-нибудь[^] Метод Linq ;)

Проверьте мой прошлый ответ на этот вопрос: Несколько значений в 1 параметре с помощью LINQ[^]

Мое лучшее предположение:

var KeyWord = db.tblProfiles
    .Where(x => words.Any(y=< y==x.tblCaste.Caste) || 
                words.Any(y=< y==x.tblCountry.Country) ||
                words.Any(y=< y==x.City) ||
                words.Any(y=< y==x.tblOccupation.Occupation) ||
                words.Any(y=< y==x.tblMotherTongue.MotherTongue))
    .Select(...);


Примечание: не тестируется на большой части данных.


Member 12115746

если у нас есть профиль типа India, Cast1 в одном профиле и во втором профиле India, cast2,
если мы хотим найти Индию, cast2, то выше кода Вы получите 2 записи. но с моим требованием ни один профиль не должен отображаться, потому что пользователь хочет, чтобы оба профиля соответствовали критериям соответствия.