将DataTable转换为LINQ匿名类型

Abd*_*yed 3 c# linq datatable

我想要一个函数,它接受一个数据表并返回一个List(对象不是DataRow)例如.:

我知道我可以这样做(但这需要知道列名):

        // Datatable dt = Filled from a Database query & has 3 columns Code,Description & ShortCode

        List<object> rtn = new List<object>();

        var x = from vals in dt.Select()
                select new
                {
                    Code = vals["Code"],
                    Description = vals["Description"],
                    ShortCode = vals["ShortCode"],
                };
        rtn.AddRange(x)

        return  rtn;
Run Code Online (Sandbox Code Playgroud)

我想要的是一个通用版本,以便我可以传入任何数据表,它将根据数据表中的列名生成.

Sar*_*thy 5

由于在编译时不知道属性名称,并且您希望将数据用于JSON序列化,因此可以使用以下命令创建字典列表.如果使用Newtonsoft JSON,则序列化负责转换JSON对象格式的键值对.

IEnumerable<Dictionary<string,object>> result = dt.Select().Select(x => x.ItemArray.Select((a, i) => new { Name = dt.Columns[i].ColumnName, Value = a })
                                                                                   .ToDictionary(a => a.Name, a => a.Value));
Run Code Online (Sandbox Code Playgroud)


Piy*_*ush 5

为了动态创建属性以便处理具有不同列集的不同数据表,我们可以使用System.Dynamic.ExpandoObject。它基本上实现了 IDictionary <string,object>。该格式可以轻松转换为 JSON。

        int colCount = dt.Columns.Count;
        foreach (DataRow dr in dt.Rows)
        {
            dynamic objExpando = new System.Dynamic.ExpandoObject();
            var obj = objExpando as IDictionary<string, object>;

            for (int i = 0; i < colCount; i++)
            {
                string key = dr.Table.Columns[i].ColumnName.ToString();
                string val = dr[key].ToString();

                obj[key] = val;
            }
            rtn.Add(obj);
        }         

        String json = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(rtn);
Run Code Online (Sandbox Code Playgroud)