简化我的C#Linq声明?

Roy*_*mir 2 c# linq linq-to-dataset

课程:

class Foo
{
    public int Id { get; set; }
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

名单

List<Foo> lst = new List<Foo>();
Run Code Online (Sandbox Code Playgroud)

数据表:

 DataTable dt = GetFromDb ()....
Run Code Online (Sandbox Code Playgroud)

我想填写lst来自的记录dt.

我做过:

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

题 :

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

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

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

Shy*_*yju 7

试试这个

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

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


Luc*_*cas 7

使用LINQ to DataSet:

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);
Run Code Online (Sandbox Code Playgroud)