使用 linq 到 List<T> 的数据集
Posted
技术标签:
【中文标题】使用 linq 到 List<T> 的数据集【英文标题】:dataset to List<T>using linq 【发布时间】:2011-02-24 09:45:10 【问题描述】:我有一个DataSet
,我想将DataSet
转换为List<T>
T 型对象
如何转换我的DataSet
?它有 10 列,我的对象具有所有 10 个属性,并且它返回超过 15000 行。我想将该数据集返回到List<obj>
并循环它我该怎么做?
【问题讨论】:
【参考方案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<T>
而不是List<T>
。以下是你的做法:
var myData = ds.Tables[0].AsEnumerable()
.Select(r => new column1 = r[0].ToString(),
column2 = r[1].ToString()
/*etc*/
);
永远不要在绝对需要之前将 IEnumerable 转换为 List。
【讨论】:
我还没有测试过,但这不会使 IEnumberableDataRowCollection
。AsEnumerable
返回 IEnumerable<DataRow>
。
@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>