Я пытаюсь создать метод, который запрашивает таблицу SQL и присваивает значения, которые он находит, в новый список объектов. Вот краткий пример того, как это работает (предположит, что читатель и соединение установлены и работают правильно):Inline null check для объектов SqlDataReader
List<MyObject> results = new List<MyObject>();
int oProductID = reader.GetOrdinal("ProductID");
int oProductName = reader.GetOrdinal("ProductName");
while (reader.Read())
{
results.Add(new MyProduct() {
ProductID = reader.GetInt32(oProductID),
ProductName = reader.GetString(oProductName)
});
}
Есть около 40 других свойств тоже, всех из них обнуляемых в MyObject
определении, так что я Я стараюсь, чтобы задания были как можно более аккуратными. Проблема в том, что мне нужно назначить нулевые значения объекту, где читатель возвращает нуль. В приведенном выше коде, если читатель выбрасывает исключение «Данные является нулевым». Я знаю, что можно использовать заявление if
, чтобы сначала проверить DbNull
, но поскольку существует так много свойств, я надеюсь сохранить код чистым, не имея необходимости указывать оператор if
для каждого отдельного объекта.
Немного поиска привело меня к оператору null-coalescing, который, похоже, должен делать именно то, что я хочу. Поэтому я попытался изменить задание, чтобы выглядеть следующим образом:
ProductID = reader.GetInt32(oProductID) ?? null,
ProductName = reader.GetString(oProductName) ?? null
Который работает отлично подходит для любого string
, но дает мне ошибку Operator '??' cannot be applied to operands of type 'int' and '<null>'
(или любому другому типа данных, за исключением string
я специально крикнул int
(и все остальное). а Nullable в определении объекта, но здесь он говорит мне, что не может сделать это
Вопрос в
есть ли способ справиться с аннулирует в этом случае можно:. (1) Должно быть написано четко в строке (во избежание отдельных операторов для каждой собственности) и (2) Работайте с любыми типами данных?
Элегантно простой и работает удивительно хорошо. Шляпы к тебе, сэр. – thanby