C#内联语法结合If/Else声明类对象及动态列值赋值实现问询
解决方案:动态根据数据库列存在性赋值对象属性
我完全懂你的需求——就是想在初始化DeviceModelInfo对象时,只当数据库结果集里存在IMEI列的时候才给对应属性赋值,还要用内联的条件语法来实现对吧?下面给你两种实用的方案:
方案1:用扩展方法实现列存在性检查(推荐,复用性强)
先给IDataReader写个扩展方法,方便快速判断指定列是否存在:
public static class DataReaderExtensions { public static bool HasColumn(this IDataReader reader, string columnName) { // 遍历所有列名,忽略大小写做匹配 for (int i = 0; i < reader.FieldCount; i++) { if (reader.GetName(i).Equals(columnName, StringComparison.OrdinalIgnoreCase)) { return true; } } return false; } }
接着在你的对象初始化代码里,用**三元运算符(内联If/Else)**完成条件赋值:
while (rd.Read()) { list.Add(new DeviceModelInfo() { ID = rd.GetGuid("ID"), Manufacturer = new Manufacturer() { ID = rd.GetGuid("ManufacturerID"), Name = rd.GetString("ManufacturerName"), // 注意:修正了你原代码里的拼写错误ManufecturerType → ManufacturerType ManufacturerType = (ManufacturerEnum)rd.GetInt32("ManufacturerType") }, Model = rd.GetString("Model"), // 内联判断:列存在就赋值,否则设为null(可根据业务改成空字符串等默认值) IMEI = rd.HasColumn("IMEI") ? rd.GetString("IMEI") : null }); }
方案2:直接获取列名集合(无需额外扩展类)
要是不想写扩展方法,也可以提前把结果集的所有列名取出来,循环内直接判断就行,性能也不错:
// 提前在循环外获取所有列名,避免每次循环重复遍历 var columnNames = Enumerable.Range(0, rd.FieldCount) .Select(rd.GetName) .ToList(); while (rd.Read()) { list.Add(new DeviceModelInfo() { ID = rd.GetGuid("ID"), Manufacturer = new Manufacturer() { ID = rd.GetGuid("ManufacturerID"), Name = rd.GetString("ManufacturerName"), ManufacturerType = (ManufacturerEnum)rd.GetInt32("ManufacturerType") }, Model = rd.GetString("Model"), IMEI = columnNames.Contains("IMEI", StringComparer.OrdinalIgnoreCase) ? rd.GetString("IMEI") : null }); }
小提示
- 如果你的
IMEI属性是不可空类型(比如string而非string?),可以把null换成空字符串""或者其他符合业务逻辑的默认值。 - 用
StringComparison.OrdinalIgnoreCase是为了兼容数据库列名大小写不一致的情况(比如有的库列名是Imei或者imei)。
内容的提问来源于stack exchange,提问作者Pankaj Bhatia
相关产品推荐
相关产品推荐

