You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:11:49