Как найти наибольшее значение из базы данных, соответствующей шаблону, используя EF Core 2.1? - PullRequest
0 голосов
/ 05 апреля 2019

Я использую Entity Framework Core 2.1 для хранения таблицы под названием «Оборудование» в SQL.В этой таблице есть столбец с именем «Метка».У меня есть класс с именем Equipment со свойством Label в качестве строкового свойства.

Это свойство Label иногда может иметь шаблон #[0-9][0-9][0-9][0-9][0-9] из пользовательского ввода.

Как найти самый высокий "ярлык""значение, соответствующее приведенному выше шаблону из таблицы" Equipment "с использованием EF Core 2.1, быстрое и чистое из таблицы SQL?

var myContext = CreateDbContext();
string resultIdentifier;

        // if there is any item in the equipment table
        if (myContext.equipment.Any()) {
            var regexStr = @"^[#]+(0-9{5})$";  //TODO: how to create this regex string correctly?

            // find for any matching pattern in label column using regex
            var listFound = myContext.equipment.Where(mp => Regex.IsMatch(mp.Label, regexStr)).ToList();

            if (listFound.Any()) {
                //TODO: how to find the maximum from the pattern?
            }
            else {
                _logger.Trace("No highest label is found because no matched pattern is found.");
                resultIdentifier = null;
            }
        }
        else {
            _logger.Trace("No highest label is found because no entry in equipment table.");
            resultIdentifier = null;
        }

1) Как создать правильный шаблон соответствия строки поиска Regex #[0-9][0-9][0-9][0-9][0-9]?

2) Является ли Regex лучшим подходом для поиска шаблона с самой высокой меткой?

3) Как найти шаблон с самой высокой меткой из таблицы SQL с помощью метода EF Core?

Спасибо

1 Ответ

0 голосов
/ 05 апреля 2019

Использование регулярного выражения будет неэффективным.EF не может преобразовать Regex.IsMatch в соответствующее выражение SQL, поэтому сначала он извлекает всю таблицу оборудования, а затем применяет регулярное выражение к каждой строке таблицы.

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

. Обратите внимание на следующее:

DECLARE @foo TABLE (
    label varchar(10) null
)

INSERT @foo
SELECT '#12345'  -- 'Lowest'
UNION 
SELECT '#99999'  -- 'Highest'
UNION 
SELECT '#999999' -- 'Too Many Characters
UNION
SELECT '#123'    -- 'Not Enough Characters' 
UNION 
SELECT '#abcde1' -- 'Not the Right Characters'
UNION
SELECT '12345'   -- 'No Leading #'
SELECT label 
  FROM @foo 
 WHERE label LIKE '[#][0-9][0-9][0-9][0-9][0-9]'

вернет строки, соответствующие вашему шаблону (сам символ #является подстановочным знаком, поэтому он заключен в квадратные скобки, чтобы указать, что он является литералом):

label
=====
#12345
#99999
SELECT TOP 1 label 
  FROM @foo 
 WHERE label LIKE '[#][0-9][0-9][0-9][0-9][0-9]'
 ORDER BY label desc

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

label
=====
#99999
#12345

и добавитTOP 1 вернет первую строку:

label
=====
#99999

Есть несколько способов использовать это в EF Core, но проще всего просто использовать raw SQL-запрос :

string sql = @"SELECT TOP 1 * 
  FROM @foo 
 WHERE label LIKE '[#][0-9][0-9][0-9][0-9][0-9]'
 ORDER BY label desc";

var foundRows = myContext.equipment
    .FromSql(sql)
    .ToList();

if (foundRows.FirstOrDefault() != null) 
{
   //...do something...
}
...