170 похожих чатов

Как сделать так, чтобы EF Core при использовании FromSql enum

подставлял как строку, а не как число?

Например context.Table.FromSql($"select {enumValue}...")
enumValue надо подставить как строку, а не как число

36 ответов

24 просмотра
Tetsujin- Автор вопроса
Егорка Миллер 🇷🇺❤️
.ToString

ну это костыль к сожалению, должен быть нормальный способ задать конвертер

А что делает Select {enumValue}? Во что это превратиться должно?

Tetsujin- Автор вопроса
Oleg Safonov
А что делает Select {enumValue}? Во что это превра...

Неважно на самом деле, что делает Select. Это просто пример. Моя задача заставить EF Core забиндить enum как строку в raw sql, а что там за sql не так важно. Причем когда пишешь code first все эти конвертеры https://learn.microsoft.com/en-us/ef/core/modeling/value-conversions?tabs=data-annotations успешно работают, а когда используешь raw sql - то нет.

Tetsujin- Автор вопроса

это явно не так, потому что EF Core под капотом генерирует sql с биндами, а не подставляет бинды в строку интерполяцией

Tetsujin
это явно не так, потому что EF Core под капотом ге...

Откуда инфа такая? Покажите весь код был не прав

Tetsujin
это явно не так, потому что EF Core под капотом ге...

Если хотите без биндов raw собирать, то советую SqlKata

Brom Samedi
Если хотите без биндов raw собирать, то советую Sq...

Результат компиляции запроса в . ToString() дает чистый запрос

Tetsujin- Автор вопроса
Oleg Safonov
Откуда инфа такая? Покажите весь код был не прав

await using var context = await _contextFactory.CreateDbContextAsync(); var result = await context.Table.FromSql(@$" select * from tab where status = {status}") .ToArrayAsync(); исключение: Failed executing DbCommand (100ms) [Parameters=[p0='?' (DbType = Int32)], CommandType='Text', CommandTimeout='30'] select * from table where status = @p0 как видишь статус превратился в бинд p0 если еще посмотреть исходники FromSql, видно, что там непросто string, а специальный класс FormattableString

Tetsujin
Неважно на самом деле, что делает Select. Это прос...

Вы в БД получается строки храните, а не числа от enum'ов?

Tetsujin
await using var context = await _contextFa...

да, я уже убедился, сорян, не прав был

Tetsujin
await using var context = await _contextFa...

Это сделано специально как защита от инъекций

Tetsujin- Автор вопроса
Pavel Gorbunov
Это сделано специально как защита от инъекций

ну это понятное дело, но мой вопрос о другом же)

Tetsujin
ну это костыль к сожалению, должен быть нормальный...

Я в свое время не стал разбираться и просто в отдельной переменной писал string value = enum.ToString(). Просто и работает и не тратит времени на размышления

Tetsujin- Автор вопроса
Andrew Shurunov
Я в свое время не стал разбираться и просто в отде...

Вариант рабочий, просто странно, что нет универсального способа.

Tetsujin
Почему?

потому что это число?

Tetsujin- Автор вопроса
Anton 『被遗忘的社会』
потому что это число?

Это в рантайме C# enum реализован как число, но это не значит, что все enum везде должны быть числами.

Anton 『被遗忘的社会』
потому что это число?

Удобно читать БД где вместо Male и Female у тебя 0 и 1?

Andrew Shurunov
Удобно читать БД где вместо Male и Female у тебя 0...

Да, никто не мешает сделать свою админ панель с CRUD к дб где это будет выпадающим списком/текстом

Tetsujin- Автор вопроса
Andrey Onishchenko
Да, никто не мешает сделать свою админ панель с CR...

зачем мне делаю свою админ панель с crud, когда есть datagrip например

Andrey Onishchenko
Ну так а в чем проблема?

В том что в датагрипе это будут числа

И? Если ты так часто лазишь в дб, то в чем проблема запомнить

Tetsujin- Автор вопроса
Andrey Onishchenko
И? Если ты так часто лазишь в дб, то в чем проблем...

Если я порядок значений в енаме поменяю, у меня десериализация сломается.

Tetsujin
Если я порядок значений в енаме поменяю, у меня де...

1) Зачем менять порядок значений? 2) можно переопределить числа и сохранить сериализацию)

Tetsujin- Автор вопроса
Andrey Onishchenko
1) Зачем менять порядок значений? 2) можно переопр...

1. Ну при рефакторинге мало ли захочется. 2. Надо не забыть переопределить числа.

Andrey Onishchenko
1) Зачем менять порядок значений? 2) можно переопр...

Давай я тебе скину все наши енамы и на 10к поспорим, что ты за неделю их выучишь?

Tetsujin
1. Ну при рефакторинге мало ли захочется. 2. Надо ...

Если тебе хочется менять порядок значений так часто, то тут уже проблема в тебе

Tetsujin
1. Ну при рефакторинге мало ли захочется. 2. Надо ...

Просто нужно сразу задавать числа и всё, тогда меняйте порядок как хотите

Andrew Shurunov
Давай я тебе скину все наши енамы и на 10к поспори...

Не буду спорить, возможно у вас так) Я в дб не лазю часто, энумов у меня парочка. А на админ панели в браузере они в виде dropdown при редактировании так что удобно.

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта