简化我的C#Linq声明?

时间:2012-08-06 15:24:35

标签: c# linq linq-to-dataset

课程:

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 )
  2. 知道选择签名的一部分(在这种情况下)是Func<datarow,void>,它不会编译

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

5 个答案:

答案 0 :(得分: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类型,因此您需要指定每个列类型的内容。

答案 1 :(得分: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);

答案 2 :(得分: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了。

答案 3 :(得分: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()
}));

答案 4 :(得分: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();