zoukankan      html  css  js  c++  java
  • DataTable转List<dynamic>

    DataTable转List<dynamic>

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

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

        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;
            }
        }
    

      页面代码如下:

        <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。

  • 相关阅读:
    php CI笔记
    Apache 2.4权限设置( you don't have permission to access / on this server Apache2.4)
    关闭浏览器时退出登录
    onunload 和 onbeforeunload都不执行
    apache ab压力测试工具需要用户登录才能测得时候怎么办?
    《国富论》读书笔记
    数据库设计技巧
    溜到不行。。
    Session和Cookie
    c#缓存
  • 原文地址:https://www.cnblogs.com/kissdodog/p/5683979.html
Copyright © 2011-2022 走看看