有没有更好的方法从数据表中获取列值
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"),
...
};
我必须检查该列是否存在,然后继续从第一行获取值。但是这么多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"),
...
};