C军

不玩博客了!

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  496 随笔 :: 0 文章 :: 634 评论 :: 571万 阅读

DataTable转List<dynamic>

最近做的一个项目,MVC+Ado.net。没有ORM很不习惯。找到一个办法,DataTable转List<dynamic>,这样代码就比较好看一点,主要是为了配合
Razor好用点。本来想自己写一个,结果发现网上已经有人写好了。直接拿来用吧。
来源:http://www.oschina.net/code/snippet_1011399_54272

有过滤字段,和反转过滤字段。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
public class DYController : Controller
{
     
    public ActionResult Index()
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("Id");
        dt.Columns.Add("Name");
 
        dt.Rows.Add(1, "刘备");
        dt.Rows.Add(2, "关羽");
        dt.Rows.Add(3, "张飞");
 
        List<dynamic> ListPerson = dt.ToDynamicList();
        ViewBag.ListPerson = ListPerson;
        return View();
    }
}
 
/// <summary>
/// DataTable 扩展
/// </summary>
public static class DataTableExtensions
{
    /// <summary>
    /// 将DataTable 转换成 List<dynamic>
    /// reverse 反转:控制返回结果中是只存在 FilterField 指定的字段,还是排除.
    /// [flase 返回FilterField 指定的字段]|[true 返回结果剔除 FilterField 指定的字段]
    /// FilterField  字段过滤,FilterField 为空 忽略 reverse 参数;返回DataTable中的全部数
    /// </summary>
    /// <param name="table">DataTable</param>
    /// <param name="reverse">
    /// 反转:控制返回结果中是只存在 FilterField 指定的字段,还是排除.
    /// [flase 返回FilterField 指定的字段]|[true 返回结果剔除 FilterField 指定的字段]
    ///</param>
    /// <param name="FilterField">字段过滤,FilterField 为空 忽略 reverse 参数;返回DataTable中的全部数据</param>
    /// <returns>List<dynamic></returns>
    public static List<dynamic> ToDynamicList(this DataTable table, bool reverse = true, params string[] FilterField)
    {
        var modelList = new List<dynamic>();
        foreach (DataRow row in table.Rows)
        {
            dynamic model = new ExpandoObject();
            var dict = (IDictionary<string, object>)model;
            foreach (DataColumn column in table.Columns)
            {
                if (FilterField.Length != 0)
                {
                    if (reverse == true)
                    {
                        if (!FilterField.Contains(column.ColumnName))
                        {
                            dict[column.ColumnName] = row[column];
                        }
                    }
                    else
                    {
                        if (FilterField.Contains(column.ColumnName))
                        {
                            dict[column.ColumnName] = row[column];
                        }
                    }
                }
                else
                {
                    dict[column.ColumnName] = row[column];
                }
            }
            modelList.Add(model);
        }
        return modelList;
    }
}

  页面代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
<table>
    <tr>
        <th>Id</th>
        <th>Name</th>
    </tr>
    @foreach (dynamic item in ViewBag.ListPerson)
    {
        <tr>
            <th>@item.Id</th>
            <th>@item.Name</th>
        </tr>
    }
</table>

  

DataTable转List<dynamic>仅仅是由于习惯了ORM的写法,实际上点出来也没有代码提示,意义不大。

dynamic做数据传递,实际上比较方便的是用于后端代码接收前端提交过来的JSON,然后转dynamic解析比较直观易懂可直接点出属性,而且不用写太多与之一一对应的Model类。

但是后端向前端传JSON的话,还是用数据字典Dictionary比较好。因为到写前端代码的时候也依然可以点出来:Dic[id] = 1、Dic[Name] = "关羽" => data.Id、 data.Name。

posted on   逆心  阅读(3882)  评论(1编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示