使用 linq 到 List<T> 的数据集

Posted

技术标签:

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

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

T 型对象

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

【问题讨论】:

【参考方案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 表达式 + 扩展方法 + 闭包 + 匿名类型)。

以上是关于使用 linq 到 List<T> 的数据集的主要内容,如果未能解决你的问题,请参考以下文章

将 List<Expression<Func<T, bool>>> 组合到 OR 子句 LINQ [重复]

使用 LINQ 从数据集中选择行,其中 RowsID 的列表位于 List<T>

linq多表查询怎么用List<T>返回?

利用linq to sql 建立查询方法返回值类型为List<T> 怎样去除集合中的重复数据?

LINQ 常见用法

Linq语句AsEnumerable()的使用