2

班级 :

class Foo
{
    public int Id { get; set; }
    public string Name { get; set; }
}

列表

List<Foo> lst = new List<Foo>();

数据表:

 DataTable dt = GetFromDb ()....

我想填写lst来自dt.

我已经做到了:

Array.ForEach(dt.AsEnumerable().ToArray(), y = > lst.Add(new Foo()
{
    Id = int.Parse(y["id"].ToString()), Name = y["name"].ToString()
}));

问题 :

  1. 我不能做点别的 dt.AsEnumerable().Select(_ => fill lst )吗?

知道选择签名的一部分(在这种情况下)是Func<datarow,void>不会编译的

但是,除了我的丑陋方式之外,还有其他方法吗?

4

5 回答 5

7

尝试这个

var fooList = (from t in dt.AsEnumerable() 
         select new Foo { Id = t.Field<int>("Id"), 
                          Name= t.Field<string>("Name") }).ToList();

DataTable 上的AsEnumerable扩展方法将返回 DataRows 的集合。然后您使用必填字段从您的 Linq 结果中进行投影。由于它是 dataRow 类型,因此您需要指定每个列的类型。

于 2012-08-06T15:29:56.123 回答
7

使用LINQ 到数据集

var foos = from row in dt.AsEnumerable()
           select new Foo()
           {
              Id = row.Field<int>("id"),
              Name = row.Field<string>("name")
           };

// create a new list
List<Foo> lst = foos.ToList();

// update: add items to an exisiting list
fooList.AddRange(foos);
于 2012-08-06T15:31:43.573 回答
4

您走在正确的轨道上,您可以执行以下操作:

lst = dt.AsEnumerable().Select(y = > new Foo()
{
    Id = Convert.ToInt32(y["id"]), Name = y["name"] as string
}).ToList();

编辑:添加到现有列表

我通常只会连接两个列表:

lst = lst.Concat(dt.AsEnumerable().Select(...)).ToList();

但是看到 ken2k 的答案后,我想我现在将开始使用AddRange

于 2012-08-06T15:28:29.267 回答
2

你可以这样做:

List<Foo> lst = dt.AsEnumerable().Select(z => new Foo
{
    Id = int.Parse(z["id"].ToString()),
    Name = z["name"].ToString()
}).ToList();

编辑:

如果要附加到现有List<Foo>实例:

lst.AddRange(dt.AsEnumerable().Select(z => new Foo
{
    Id = int.Parse(z["id"].ToString()),
    Name = z["name"].ToString()
}));
于 2012-08-06T15:28:35.887 回答
1

我通过 Rows 属性得到了另一个解决方案:

 List<Foo> results = (from DataRow myRow in dt.Rows
                               select new Foo()
                            {
                              Id =int.Parse( row["id"].ToString()),
                              Name = row["name"].ToString()
                             }).ToList();
于 2012-08-06T19:21:14.470 回答