Как игнорировать конечные пробелы?

Предположим, таблица SQL содержит столбец char(10), а запись содержит значение «ABC» в этом столбце. Entity Framework пройдет ABC («ABC» с 7 конечными пробелами) при запросе значения.

Есть ли способ попросить Entity Framework игнорировать конечные пробелы при получении значения столбца типа char, по сути, вместо этого EF обрабатывает его как varchar?

Беглый взгляд на методы, доступные в свободном API, не дал очевидных решений. Удаление entity.Property(e => e.CharColumn).IsFixedLength() не дает желаемого эффекта обрезки конечных пробелов. Изменение типа столбца с char на varchar в базе данных SQL не является вариантом в моем случае использования, поскольку это может помешать работе других программ, находящихся вне моего контроля, которые читают эту таблицу.

Обрезать себя после получения данных? Символ 10 означает, что есть 10 символов, а не 10 или меньше, поэтому я предполагаю, что в нем ничего нет.

Ralf 29.04.2024 15:25
Вот несколько способов сделать это. Там может быть что-то для первой базы данных, сначала модели EF, EF Core и т. д.
Ralf 29.04.2024 15:27

ЭФ прав. Поле char(10) всегда содержит 10 символов. Столбец не содержит ABC, он содержит ABC . Либо удалите IsFixedLength() и используйте поле varchar, либо добавьте явную обрезку в свое приложение.

Panagiotis Kanavos 29.04.2024 15:34

Почему вы хотите обрезать фактическое значение? Это для демонстрации? Поиск? Сравнение? Это важно. Для поиска и сравнения SQL Server дополняет любое значение длиной менее 10 символов до полной длины в 10 символов, поэтому ABC равно ABC . Никакая обрезка этого не изменит. Если вы хотите обрезать изображение, лучше сделать это в ViewModel или View.

Panagiotis Kanavos 29.04.2024 15:38

Вы могли бы рассмотреть возможность введения нового столбца varchar, в котором у вас есть логика, контролирующая, следует ли обрезать символы при сохранении в БД.

Neil Busse 29.04.2024 15:40

Расскажите нам, почему вы этого хотите

flackoverstow 29.04.2024 19:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вместо использования свойства auto в вашем классе сущности вы можете создать его самостоятельно, обрезав значения.

private string _myProp;
public string MyProp
{
    get => _myProp?.TrimEnd();
    set => _myProp = value;
}

Будьте осторожны, делая это в установщике. Я не уверен насчет Entity Framework, но EF Core напрямую присваивает значения резервному полю, если оно его находит, минуя установщик. Предполагая, что Entity Framework не обходит установщик:

private string _myProp;
public string MyProp
{
    get => _myProp;
    set => _myProp = value?.TrimEnd();
}

Это не EF, который обходит установщик. Во всех базах данных поля фиксированной длины дополняются пробелами — или, по крайней мере, так должно быть в соответствии со стандартом SQL. SQL-сервер будет хранить ABC . Во время сравнения строковые значения будут дополняться до длины поля, поэтому ABC равно ABC .

Panagiotis Kanavos 29.04.2024 15:40

Если ОП захочет обрезать, чтобы можно было искать только ABC, он поймет, что изменений нет.

Panagiotis Kanavos 29.04.2024 15:41

@PanagiotisKanavos мое решение устраняет проблему во внешнем интерфейсе. SQL-Server игнорирует конечные пробелы при сравнении: fiddle

Olivier Jacot-Descombes 29.04.2024 15:58

Я хочу сказать, что мы не знаем реальной проблемы. Если это только для пользовательского интерфейса, это будет работать. Если ОП хочет исключить ABC при поиске ABC, это не произойдет.

Panagiotis Kanavos 29.04.2024 16:02

Другие вопросы по теме