Использование регулярного выражения будет неэффективным.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...
}