none
【C#】datatable 如何转化为ILIST泛型实体类 RRS feed

  • 问题

  • 我现在返回了一个datatable 想转换一成实体类泛型,ArticleInfo是我的实体类

    我现在的写法是 dt.AsEnumerable().ToList<ArticleInfo>(); 但是不行,请高手指点

    public IList<ArticleInfo> getNewsListDao(string sql){

    dt.AsEnumerable().ToList<ArticleInfo>();//这里应该如何写啊

    }


    煜诚海参专卖 淘宝店铺:http://jinweb.taobao.com

    2014年1月6日 9:07

答案

全部回复

  • dt.AsEnumerable()
            .Select(dr =>
                new ArticleInfo
                    {                    
                        PropertyName = dr.Field<string>("DataColumnName"),
                    }).ToList();

    http://feiyun0112.cnblogs.com/

    2014年1月6日 9:52
    版主
  • 感谢你的帮助,此方法可行。小弟还有一个问题挺纠结,希望大侠指点一下。

    之前没改的方法为:

            public DataSet getNewsListDao(string sql) //获取数据
            {
                SqlParameter[] sp = { new SqlParameter("@sql", sql) };
                return AppliConfig.RunProcedure(sqlConn, tx, "PROCName", sp, "Table");
            }

            public void GetData() //绑定数据
            {
                DataSet ds = getNewsListDao("id");
                for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
                {
                    string Cn1 = ds.Tables[0].Rows[i]["Cn1"].ToString();
                    string Cn2 = ds.Tables[0].Rows[i]["Cn2"].ToString();
                    this.LoadD.Text += "<div>"+Cn1+"</div><div>"+Cn2+"</div>";
                }
            }

    根据你的指导修改后的方法如下:

    public List<ArticleInfo> getNewsListDao(string sql)//获取数据
            {
                SqlParameter[] sp = { new SqlParameter("@sql", sql) };
                DataTable dt = (AppliConfig.RunProcedure(sqlConn, tx, "PROCName", sp, "Table")).Tables["T_ARTICLE_INFO"];
                return dt.AsEnumerable().Select(dr => new ArticleInfo { Cn1 = dr.Field<int>("Cn1"), Cn2 = dr.Field<string>("Cn2") }).ToList();
            }

            public void GetData()//绑定数据
            {
                IList<ArticleInfo> AiList = getNewsListDao("id"); //ArticleInfo为实体类
                foreach (ArticleInfo ai in AiList)
                { 
                   this.LoadD.Text += "<div>"+ai.Cn1+"</div><div>"+ai.Cn2+"</div>";
                }

            }

     请问后改的方法是否是否比之前的方法更高效。虽然对泛型还不太熟,但看到网上有人说泛型可以提高效率。于是我把之前的方法改成了泛型的结构。但令我不解的是,前面获取数据方法中 dt.AsEnumerable().Select(dr => new ArticleInfo { Cn1 = dr.Field<int>("Cn1"), Cn2 = dr.Field<string>("Cn2") }).ToList();把datable转换成了Ilist泛型集合。然后再绑定数据中再次获取实体类的属性值,这算不算拆箱,会不会折损效率呢?



    2014年1月6日 13:57
  • 您好:

    泛型提高效率在于避免拆箱和装箱操作。您的代码中没有看到这样的操作,就这点而言貌似谈不上效率问题。

    我倒是认为:你使用AsEnumerable方法同时使用ToList转换,这些操作可能都在内存中进行,内存相对比前者消耗大。


    ASP.NET Questions
    Other Discussions
    FreeRice Donate
    Issues to report
    Free Tech Books Search

    2014年1月7日 2:06
    版主
  • 你好,感谢你的帮助。能否提供一下程序运行效率检测这样的软件,我想通过实验证明一下。

    煜诚海参专卖 淘宝店铺:http://jinweb.taobao.com

    2014年1月7日 2:16
  • 你可以在你的代码中使用System.Diagnostics.Stopwatch来检测代码运行时间,也可以使用这个方法:

    http://heisetoufa.iteye.com/blog/347311


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年1月7日 6:39
    版主