【问题标题】:dataset to List<T>using linq使用 linq 到 List<T> 的数据集
【发布时间】:2011-02-24 09:45:10
【问题描述】:

我有一个DataSet,我想将DataSet 转换为List&lt;T&gt;

T 型对象

如何转换我的DataSet?它有 10 列,我的对象具有所有 10 个属性,并且它返回超过 15000 行。我想将该数据集返回到List&lt;obj&gt; 并循环它我该怎么做?

【问题讨论】:

    标签: linq dataset


    【解决方案1】:

    我使用的一个非常简单的方法如下:

    List<Obj> objList = new List<Obj>();      
    foreach (DataRow _dataRow in dataSet.Tables[0].Rows)
                        {
                            Obj obj = new Obj();
                            obj.Col1 = Convert.ToInt32(_dataRow["Col1"]);
                            obj.Col2 = Convert.ToInt32(_dataRow["Col2"]);
                            obj.Col3 = Convert.ToString(_dataRow["Col3"]);
                            objList.Add(obj);
                        }
    

    【讨论】:

      【解决方案2】:

      感谢以上所有帖子...

      我已经使用 Linq Query 完成了,详情请访问链接

      http://codenicely.blogspot.com/2012/02/converting-your-datatable-into-list.html

      【讨论】:

        【解决方案3】:

        我知道@bharat 要求使用 LINQ 的解决方案,但主要是为了我自己,我想将@Kelsey 的解决方案与 老式 这样做的方式进行比较:

        List<Obj> list = new List<Obj>();
        
        foreach (DataRow r in yourDataSet.Tables[0].Rows)
        {
            Obj obj = new Obj();
            obj.Column1 = r["Column1"];
            obj.Column2 = r["Column2"];
            obj.Column3 = r["Column3"];
            obj.Column4 = r["Column4"];
            obj.Column5 = r["Column5"];
            obj.Column6 = r["Column6"];
            obj.Column7 = r["Column7"];
            obj.Column8 = r["Column8"];
            obj.Column9 = r["Column9"];
            obj.Column10 = r["Column10"];
        
            list.Add(obj);
        }

        或者通过构造函数:

        List<Obj> list = new List<Obj>();
        
        foreach (DataRow r in yourDataSet.Tables[0].Rows)
        {
            Obj obj = new Obj(r["Column1"], r["Column2"], r["Column3"], r["Column4"], r["Column5"],r["Column6"], r["Column7"], r["Column8"], r["Column9"],r["Column10"]);
        
            list.Add(obj);
        }

        我故意不使用.ToString(),因为我认为使用它取决于具体情况。

        【讨论】:

          【解决方案4】:

          这与其他答案几乎相同,但引入了强类型列。

          var myData = ds.Tables[0].AsEnumerable().Select(r => new {
              column1 = r.Field<string>("column1"),
              column2 = r.Field<int>("column2"), 
              column3 = r.Field<decimal?>("column3")
          });
          var list = myData.ToList(); // For if you really need a List and not IEnumerable
          

          【讨论】:

          • 可惜我不能+2!太感谢了
          【解决方案5】:

          首先,您走在正确的轨道上,但您应该考虑IEnumerable&lt;T&gt; 而不是List&lt;T&gt;。以下是你的做法:

           var myData = ds.Tables[0].AsEnumerable()
                            .Select(r => new {column1 = r[0].ToString(), 
                                              column2 = r[1].ToString() 
                                              /*etc*/
                                    });
          

          永远不要在绝对需要之前将 IEnumerable 转换为 List。

          【讨论】:

          • 我还没有测试过,但这不会使 IEnumberable 成为可能吗? Tables[0] 返回一个 DataTable,其中 Tables[0].Rows 返回DataRowCollection
          • @Kelsey - DataTable 上有一个特殊的扩展方法 AsEnumerable 返回 IEnumerable&lt;DataRow&gt;
          • @Greg oooooh didn't' know that...intellisense 来测试我的代码会有所帮助:)
          • 为什么在需要之前从不IEnumerable转换为List
          • @JohnB 因为这会迫使您实际枚举集合,并且通常还会分配大量新内存。这对性能非常不利。
          【解决方案6】:

          我认为应该这样做。

          var output = yourDataSet.Tables[0].Rows.Cast<DataRow>().Select(r => new
          {
              Column1 = r["Column1"].ToString(),
              Column2 = r["Column2"].ToString(),
              Column3 = r["Column3"].ToString(),
              Column4 = r["Column4"].ToString(),
              Column5 = r["Column5"].ToString(),
              Column6 = r["Column6"].ToString(),
              Column7 = r["Column7"].ToString(),
              Column8 = r["Column8"].ToString(),
              Column9 = r["Column9"].ToString(),
              Column10 = r["Column10"].ToString()
          }).ToList();
          

          【讨论】:

          • +1 请原谅我的无知,但这是 LINQ 吗? (我还没学过LINQ)
          • 是的。它几乎是遍历 Table[0] 中的所有行,然后创建一个具有所有列属性的新匿名类型的列表。我还没有测试它,所以可能会有一些小故障:)
          • 它有点像 linq - 直接使用使 linq 查询理解语法成为可能的底层特性(lambda 表达式 + 扩展方法 + 闭包 + 匿名类型)。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-06
          • 1970-01-01
          • 1970-01-01
          • 2011-10-27
          相关资源
          最近更新 更多