Как написать запрос OrderBy с необработанным SQL в EFCore?

#entity-framework-core #.net-5

#сущность-структура-ядро #.net-5

Вопрос:

У меня есть запрос EFCore:

  return await _context.Rubrics
                .AsNoTracking()
                .Where(i => i.IsApproved == true)
                .Include(i => i.EdDraft)
                .Include(i => i.Rubric)
                .ThenInclude(i => i.Title)
                .Where(i => i.EdDraft.AccountId == accountId)
                .OrderBy(i => i.Path)
                .ToListAsync();
 

i.Путь — это строка, подобная «1-5-3», «1-5-3-2», «9-18-12» и так далее…
Я должен упорядочить по символу — первому символу, например, упорядочить по «1-«, «9-» и т. Д.

Я не хочу переписывать весь запрос с помощью необработанного sql. В Laravel я делаю:

 orderBy(DB::raw(...sql))
 

но в EFCore я не могу найти решение.

Я знаю, как я могу переписать на стороне клиента (.AsEnumerable), но мне нужно написать запрос на стороне сервера.

Запрос должен быть упорядочен по первому символу в строке.

Ответ №1:

Ядро EF отлично переводит метод подстроки строки в SQL, но для этого требуется перегрузка 2 параметров. Итак, если я правильно понял ваш вопрос — «как упорядочить запрос только по первому символу» — используйте:

  return await _context.Rubrics
                .AsNoTracking()
                .Where(i => i.IsApproved == true)
                .Include(i => i.EdDraft)
                .Include(i => i.Rubric)
                .ThenInclude(i => i.Title)
                .Where(i => i.EdDraft.AccountId == accountId)
                .OrderBy(i => i.Path.Substring(0,1))
                .ToListAsync();