LINQ to SQL найти записи, в которых слова в предложении начинаются с определенных символов c - PullRequest
1 голос
/ 19 июня 2020

У меня есть SQL Таблица серверов:

ID | Code | Name
 1 | AS   | Andrew Smith
 2 | RA   | Ryan Andrews
 3 | ZS   | Zach Simmons

Я хочу найти записи, в которых начало кода или начало имени или фамилии в столбце Имя совпадает с ключевой фразой . Например, если ключевая фраза - «A», она должна вернуть:

 1 | AS   | Andrew Smith
 2 | RA   | Ryan Andrews

, поскольку код и имя Эндрю Смита совпадают с «A», а фамилия Андре Райана совпадает с «A». .

Запрос, который у меня есть до сих пор:

 var keyphrase = 'aa';
 var employees = await (from e in _dbContext.Employee
                              where EF.Functions.Like(e.Code, $"{keyphrase}%")
                              orderby e.Code ascending
                              select e).ToListAsync();

Это хорошо работает для поиска по Коду. Но я не уверен, как сопоставить ключевую фразу с именем и фамилией в столбце имени. Опять же, я не хочу использовать Contains, но StartsWith.

Я использую EF core 3.1.

Любая помощь приветствуется.

Ответы [ 3 ]

1 голос
/ 20 июня 2020

Предполагая, что вы используете пробел (" ") перед каждым термином, который хотите проверить, вы можете использовать следующий трюк:

where EF.Functions.Like(" " + e.Name, "% " + keyphrase + "%")

Обратите внимание на пробел, добавленный перед значением столбца и ключевой фразой. Пробел перед столбцом предназначен для обработки ключевой фразы в начале значения столбца.

В качестве альтернативы вы можете использовать 2 отдельных условия для сопоставления начального и промежуточного терминов:

where EF.Functions.Like(e.Name, keyphrase + "%")
   || EF.Functions.Like(e.Name, "% " + keyphrase + "%")
0 голосов
/ 20 июня 2020

StartsWith должно работать с EF Core - он преобразуется в SQL LIKE с завершающим %. Я бы предложил использовать его и Contains:

var keyphrase = 'aa';
var employees = await (from e in _dbContext.Employee
                       where e.Code.StartsWith(keyphrase) || e.Name.StartsWith(keyphrase) || e.Name.Contains($" {keyphrase}")
                       orderby e.Code ascending
                       select e).ToListAsync();
0 голосов
/ 19 июня 2020

Вот способ пакета Nuget, или вы можете получить исходный код из Git Hub, если вам нужны классы:

Nuget: DataJuggler.UltimateHelper.Core

using DataJuggler.Core.UltimateHelper;
using DataJuggler.Core.UltimateHelper.Objects;

// set the text
string text = "For a good night's sleep before bed, avoid caffiene.";

// split into lines if needed
List<TextLine> lines = WordParser.GetTextLines(text);

// verify the lines exist and have one or more items
if (ListHelper.HasOneOrMoreItems(lines))
{
    // Iterate the collection of TextLine objects
    foreach (TextLine textLine in lines)
    {
        // get the words
        List<Word> words = WordParser.GetWords(textLine.Text);

        // If the words collection exists and has one or more items
        if (ListHelper.HasOneOrMoreItems(words))
        {
            // Iterate the collection of Word objects
            foreach (Word word in words)
            {
                if (word.Text.ToLower().StartsWith("a"))
                {   
                    // do something for a
                }
                else if (word.Text.ToLower().StartsWith("b"))
                {   
                    // do something else for b
                }
                else if (word.Text.ToLower().StartsWith("c"))
                {   
                    // do something else for c
                }
            }
        }
    }
}

If у вас нет нескольких строк, вы можете пропустить часть строк синтаксического анализа, но я использовал этот класс в течение многих лет и люблю его.

Полный исходный код находится на Nuget: https://github.com/DataJuggler/DataJuggler.UltimateHelper.Core

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