Как найти точную запись по веб-интерфейсу asp.net с помощью lamda expresion - PullRequest
0 голосов
/ 31 августа 2018

Привет всем! У меня возникла проблема при поиске точной записи с помощью метода запросов LINQ в asp.net web api. Код моего контроллера не выполняется

 [HttpGet]
        [Route("api/tblProducts/AllProductbySearch/{SearchText}")]
        [ResponseType(typeof(IEnumerable<tblProduct>))]
        public IHttpActionResult AllProductbySearch(string SearchText)
        {
            IEnumerable<tblProduct> tblProduct = db.tblProducts.Where(x=>x.PrdKeyword.Contains(SearchText)).AsEnumerable();
            if (tblProduct == null)
            {
                return NotFound();
            }

            return Ok(tblProduct);
        }

В этом случае я выполняю поиск записи со значением иметь ключевое слово coloum и получаю результат, но проблема в том, что он не дает точного результата, например, если в базе данных две записи имеют значение столбца ключевого слова, например рубашка, а другая - Tshirt затем, если я передам футболку в SearchText или футболку в SearchText, она выдаст обе записи, а я хочу одну запись, которая точно соответствует SearchText, Pleae поможет мне

Мой обновленный код метода Action UPDATE

 [HttpGet]
        [Route("api/tblProducts/AllProductbySearch/{SearchText}")]
        [ResponseType(typeof(IEnumerable<tblProduct>))]
        public IHttpActionResult AllProductbySearch(string SearchText)
        {
            IEnumerable<tblProduct> tblProduct = db.tblProducts.Where(x => CheckWord(x.PrdKeyword, SearchText)).AsEnumerable(); 

            if (tblProduct == null)
            {
                return NotFound();
            }

            return Ok(tblProduct);
        }

        private bool CheckWord(string source, string searchWord)
        {
            var punctuation = source.Where(Char.IsPunctuation).Distinct().ToArray();
            var words = source.Split().Select(x => x.Trim(punctuation));
            return words.Contains(searchWord, StringComparer.OrdinalIgnoreCase);
        }

Но выдает ту же ошибку 500

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Вы делаете простую ошибку. Вам просто нужно использовать .Equals вместо .Contains.

При использовании Contains .Net проверит, является ли входная строка частью основной строки. Принимая во внимание, что Equals проверит точное совпадение.

var mainStr = “long string with Hello World”;
var inputStr = “Hello”; 
var status = mainStr.Contains(inputStr);
// Value of status is `true`
status = mainStr.Equals(inputStr);
// Value of status is `false`

Итак, ваш код должен выглядеть так:

IEnumerable<tblProduct> tblProduct = db.tblProducts.Where(x=>x.PrdKeyword.Equals(SearchText)).AsEnumerable(); 

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

Надеюсь, это поможет!

0 голосов
/ 31 августа 2018

ИЗД. 2 Добавлен ToList () - db.tblProducts.ToList().... В этом случае мы извлекаем все данные из базы данных и фильтруем их в памяти. Если мы не извлекаем все данные перед фильтрацией, .Net пытается создать запрос к SQL с фильтрацией и не может, потому что существуют методы .Net, такие как CheckWord (). Я думаю, что мы можем получить необходимые данные без извлечения всей таблицы в память, но не знаем как. В качестве варианта мы должны написать конкретную хранимую процедуру и использовать ее. Получить все в память - это самый простой способ (но не быстрее)

Пожалуйста, посмотрите на это сообщение Получите только целые слова из оператора .Contains ()

Собственно, для вашего случая решение может быть:

IEnumerable<tblProduct> tblProduct = db.tblProducts.ToList()
    .Where(x => Regex.Match(x.PrdKeyword, $@"\b{SearchText}\b", RegexOptions.IgnoreCase).Success)
    .AsEnumerable();

Вариант 2. Без регулярного выражения:

public static bool CheckWord(string source, string searchWord) 
{
    if (source == null)
        return false;

    var punctuation = source.Where(Char.IsPunctuation).Distinct().ToArray();
    var words = source.Split().Select(x => x.Trim(punctuation));
    return words.Contains(searchWord, StringComparer.OrdinalIgnoreCase);
}

[HttpGet]
[Route("api/tblProducts/AllProductbySearch/{SearchText}")]
[ResponseType(typeof(IEnumerable<tblProduct>))]
public IHttpActionResult AllProductbySearch(string SearchText)
{
    IEnumerable<tblProduct> tblProduct = db.tblProducts.ToList()
        .Where(x => CheckWord(x.PrdKeyword, SearchText)).AsEnumerable();
    if (tblProduct == null)
    {
       return NotFound();
    }

    return Ok(tblProduct);
}

Извините, я сейчас с телефона, здесь могут быть ошибки. Попробую через 3-4 часа

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