DataTable iteration gives unwanted data

折月煮酒 提交于 2020-01-22 02:31:13

问题


I am iterating through a DataTable using SqlDataAdapter and storing it in a list. Here is my code.

public IEnumerable<DataRow> GetRecord()
{
    var table = new DataTable();
    using (var da = new SqlDataAdapter("SELECT * FROM mv_tbl", "ConnectionString"))
    {
        da.Fill(table);
        List<DataRow> list = new List<DataRow>();
        foreach (DataRow r in table.Rows)
        {
            list.Add(r);
        }

        return list;
    }
}

This gives me a result which has unnecessary data also. Here is the result.

[{"RowError":"",
"RowState":2,
"Table":[{"mv_id":2,
"mv_name":"Up",
"mv_link":"link",
"user":"admin@gmail.com",
"db_tstamp":"2020-01-01T01:50:00"},
{"mv_id":3,
"mv_name":"8 Below",
"mv_link":"link",
"user":"admin@gmail.com",
"db_tstamp":"2020-01-01T02:49:00"}],
"ItemArray":[2,"Up","link","admin@gmail.com","2020-01-01T01:50:00"],
"HasErrors":false},
{"RowError":"",
"RowState":2,
"Table":[{"mv_id":2,
"mv_name":"Up",
"mv_link":"link",
"user":"admin@gmail.com",
"db_tstamp":"2020-01-01T01:50:00"},
{"mv_id":3,
"mv_name":"8 Below",
"mv_link":"link",
"user":"admin@gmail.com",
"db_tstamp":"2020-01-01T02:49:00"}],
"ItemArray":[3,"8 Below","link","admin@gmail.com","2020-01-01T02:49:00"],
"HasErrors":false}]

My expected result is.

[{"mv_id":2,
    "mv_name":"Up",
    "mv_link":"link",
    "user":"admin@gmail.com",
    "db_tstamp":"2020-01-01T01:50:00"},
    {"mv_id":3,
    "mv_name":"8 Below",
    "mv_link":"link",
    "user":"admin@gmail.com",
    "db_tstamp":"2020-01-01T02:49:00"}]

Here is a screenshot from the database.

My original question is here.

How can I return a list of rows of dynamic table?

Where am I making a mistake.?


回答1:


You could convert the DataTable to a collection of Dictionary<string,object> (EnumerableRowCollection<Dictionary<string,object>)

var result = dt.AsEnumerable()
                    .Select(row => dt.Columns
                                     .Cast<DataColumn>()
                                     .ToDictionary(column => column.ColumnName,column => row[column]));
return result;

This would also produce the desired Json return from Web API.

Alternatively, you could return the DataTable itself or make use of collection of anonymous types or user defined class.




回答2:


I think you are trying to serialize your list (GetRecord return result).

But before serialize you need to pass datatable to below function (in your case you are returning IEnumerable<DataRow>, try passing datatable) and convert it into List. Now try serializing this List<dynamic>.

public  List<dynamic> ConvertToDynamic(DataTable dt)
{
        var lstOfDynamic = new List<dynamic>();

        foreach (DataRow row in dt.Rows)
        {
            dynamic dyn = new  System.Dynamic.ExpandoObject();

            foreach (DataColumn col in dt.Columns)
            {
                var dic = (IDictionary<string, object>)dyn;
                dic[col.ColumnName] = row[col];
            }

            lstOfDynamic.Add(dyn);
        }

        return lstOfDynamic;
    }

Hope this will help you.



来源:https://stackoverflow.com/questions/59551796/datatable-iteration-gives-unwanted-data

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!