У меня есть база данных, которую я не могу изменить, если у человека в этой базе данных пол (в большинстве случаев) «M» / «F». В некоторых случаях пол является нулевым.
В базе данных (Oracle) это определяется как столбец Gender CHAR(1 BYTE)
в базе данных.
Следующий запрос позволяет мне делать то, что я ожидал в SQL, и обернуть этот столбец в объединенную функцию
var result = from x in _context.Individuals where x.Id == 502429 select new { Sex = x.Sex ?? "U" };
Создает этот SQL ... (где я использую "u" для "unknown")
SELECT COALESCE("x"."GENDER", N'U') "Gender" FROM "INDIVIDUAL" "x" WHERE "x"."Id" = 12345 FETCH FIRST 1 ROWS ONLY
Но следующее не позволяет мне указать параметр объединения ...
var someone = await _context
.Individuals
.AsNoTracking()
.Include(x=>x...)
.Include(x=>x...)
.Where(x => x.Id == id)
.FirstOrDefaultAsync();
Вместо этого получается SQL ...
SELECT "Individual"."SEX", "..other columns.."
FROM "Individual" "x"
WHERE "x"."Id" = :id_0
FETCH FIRST 1 ROWS ONLY
Я попытался указать атрибут типа [Column("sex", TypeName = "nvarchar(1)")]
, установить значение по умолчанию для построителя моделей modelBuilder.Entity<Individual>().Property(x=>x.Sex).HasDefaultValue
, тип столбца для моделиBuilder HasColumnType
,
Как мне сгенерировать SQL, который я ожидал бы в этом случае, чтобы база данных выполняла эту работу, и я получил обратно то, на что я мог положиться в своем коде?
Мой обходной путь - использовать строку, а не тип символа, но это открывает целый другой пакет с червями, я хотел бы иметь возможность использовать Coalesce с вышеприведенным.