有没有更好的方法从数据表中获取列值

Is there a better way to get the column values from datatable

我必须检查该列是否存在,然后继续从第一行获取值。但是这么多if,看起来好期待啊

theData = GetData();
            if (theData.Rows.Count > 0)
            {
                MyModel = new CustomModel();
                dataSetRow = theData.Rows[0];
                if (theData.Columns.Contains("Column1"))
                {
                    if ((!object.ReferenceEquals(dataSetRow["Column1"], DBNull.Value)))
                    {
                        MyModel.Column1 = Convert.ToString(dataSetRow["Column1"]);
                    }
                }
                if (theData.Columns.Contains("Column2"))
                {
                    if ((!object.ReferenceEquals(dataSetRow["Column2"], DBNull.Value)))
                    {
                        MyModel.Column2 = Convert.ToString(dataSetRow["Column2"]);
                    }
                }
                if (theData.Columns.Contains("Column3"))
                {
                    if ((!object.ReferenceEquals(dataSetRow["Column3"], DBNull.Value)))
                    {
                        MyModel.Column3 = Convert.ToString(dataSetRow["Column3"]);
                    }
                }
                if (theData.Columns.Contains("Column4"))
                {
                    if ((!object.ReferenceEquals(dataSetRow["Column4"], DBNull.Value)))
                    {
                        MyModel.Column4 = Convert.ToString(dataSetRow["Column4"]);
                    }
                }

有没有什么办法可以让代码紧凑而不用那么多if。

将所有列名放在一个名为列的列表中,我假设它们的调用方式与对象属性相同

theData = GetData();
if (theData.Rows.Count > 0)
{
    MyModel = new CustomModel();
    dataSetRow = theData.Rows[0];
    foreach(column in columns)
    {
        if (theData.Columns.Contains(column))
        {
            if ((!object.ReferenceEquals(dataSetRow[column], DBNull.Value)))
            {
            MyModel.GetType().InvokeMember(column,
            BindingFlags.Instance | BindingFlags.Public | BindingFlags.SetProperty,
            Type.DefaultBinder, MyModel, Convert.ToString(dataSetRow[column]));

            }
        }
    }
}       

如果调用的属性不同,只需迭代2个列表调用正确的属性名称

好的,这个稍微短了点。它对你来说足够紧凑吗? ;)

 if (theData.Columns.Contains("Column1") && dataSetRow["Column1"] != DBNull.Value)
    MyModel.Column1 = dataSetRow["Column1"].ToString();

顺便说一句 - 只有当 dataSetRow 中的值为 DBNull 时您不想得到空字符串(只是因为 DBNull.Value.ToString() 会产生"",不是 NullReferenceException)。

一个选择是将重复的代码片段提取到一个单独的方法中:

private string GetRowValue(DataRow dr, string columnName)
{
    if (dr.Table.Columns.Contains(columnName))
    {
        if ((!object.ReferenceEquals(dr[columnName], DBNull.Value)))
        {
            return Convert.ToString(dr[columnName]);
        }
    }

    return string.Empty;
}

然后调用它来设置您的 MyModel 值:

dataSetRow = theData.Rows[0];

MyModel = new CustomModel
              {
                  MyModel.Column1 = GetRowValue(dataSetRow, "Column1"),
                  MyModel.Column2 = GetRowValue(dataSetRow, "Column2"),
                  ...
              };