Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有更好的方法从datatable获取列值_C#_Linq_Datatable - Fatal编程技术网

C# 是否有更好的方法从datatable获取列值

C# 是否有更好的方法从datatable获取列值,c#,linq,datatable,C#,Linq,Datatable,我必须检查列是否存在,然后继续从第一行获取值。但是有这么多的“如果”,它看起来很漫长 theData = GetData(); if (theData.Rows.Count > 0) { MyModel = new CustomModel(); dataSetRow = theData.Rows[0]; if (theData.Columns.Co

我必须检查列是否存在,然后继续从第一行获取值。但是有这么多的“如果”,它看起来很漫长

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。

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

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 list来调用正确的属性名

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

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 list调用正确的属性名即可,这会稍微短一些。这对你来说够紧凑吗?;)


顺便说一下,这个检查
dataSetRow[“Column1”]!=只有当
dataSetRow
中的值为DBNull时,如果不想获取空字符串,才需要DBNull.Value
(因为
DBNull.Value.ToString()
将生成
,而不是
NullReferenceException
)。

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


顺便说一下,这个检查
dataSetRow[“Column1”]!=只有当
dataSetRow
中的值为DBNull时,如果您不想获取空字符串,才需要DBNull.Value
(因为
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"),
                  ...
              };

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

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"),
                  ...
              };

真奇怪。为什么要检查data.Columns.Contains的
。您不能确保数据库正确返回列吗?这很奇怪。为什么要检查data.Columns.Contains的
。您不能确保数据库正确返回列吗?只是反射会减慢应用程序的运行速度是的,但它会按照您的要求执行。拆下整个开关。检查使用反射对许多if的代码维护是否有相当大的影响,只是反射会减慢应用程序的运行速度是的,但它会按照您的要求执行。拆下整个开关。检查使用反射对大量ifsDo的代码维护的影响是否很大,因为在所有情况下dataSetRow=Data.Rows[0],所以每次我都需要通过datSetRow。在所有情况下,因为dataSetRow=Data.Rows[0],所以每次我都需要通过datSetRow