在C#中将DataTable转换为List <t>时出错

时间:2018-05-16 06:30:30

标签: c# linq

我正在尝试将DataTable转换为通用列表List<T>,我收到此错误:

  

无法将lambda表达式转换为字符串类型,因为它不是a   委托类型

我已经在SO上发布过关于此问题的几个主题,其中大多数建议使用EntityLinq namespaces,但我仍然遇到同样的错误。

这是我的代码:

DataTable csvData = GetDataTableFromCSVFile(csv_file_path);

List<MyClass> lst = new List<MyClass>();
lst = (from l in csvData
      select new MyClass // getting red line under select
      {
       Address_1 = l.Address_1,
       //total of 29 columns
       Title = l.Title,
       Town_of_Birth = l.Town_of_Birth
      }).ToList();

3 个答案:

答案 0 :(得分:1)

您可以在linq查询中使用AsEnumerable()扩展方法来获取DataRow的集合:

class MyClass
{
    public int MyProperty { get; set; }
}


public static void Main(string[] args)
{
    DataTable table = new DataTable();
    table.Columns.Add("MyProperty", typeof(int));
    table.Rows.Add(1);
    table.Rows.Add(2);
    table.Rows.Add(3);

    List<MyClass> result = (from t in table.AsEnumerable()
                            select new MyClass
                            {
                                MyProperty = t.Field<int>("MyProperty")
                            }).ToList();

}

答案 1 :(得分:1)

对于通用解决方案,您可以通过使用泛型来尝试如下

lst = (from dataRow in csvData.AsEnumerable()
          select Converter<MyClass>.Fill(dataRow)).ToList();

class Converter<T>
    {
        public static T Fill(DataRow Row)
        {

          Type typeParameterType = typeof(T);
         object retval = Activator.CreateInstance(typeParameterType);

            Dictionary<string, PropertyInfo> props = new Dictionary<string,PropertyInfo>();
            foreach (PropertyInfo p in retval.GetType().GetProperties())
                props.Add(p.Name, p);
            foreach (DataColumn col in Row.Table.Columns)
            {
                string name = col.ColumnName;
                if (Row[name] != DBNull.Value && props.ContainsKey(name))
                {
                    object item = Row[name];
                    PropertyInfo p = props[name];
                    if (p.PropertyType != col.DataType)
                        item = Convert.ChangeType(item, p.PropertyType);
                    p.SetValue(LogicObject, item, null);
                }
            }
        return (T)retval ;
        }
    }

你需要这样做,使用AsEnumerable

lst = (from dataRow in csvData.AsEnumerable()
      select new MyClass // getting red line under select
      {
       Address_1 = Convert.ToString(dataRow["Address_1"]),
       //total of 29 columns
       Title = Convert.ToString(dataRow["Title"]),
       Town_of_Birth = Convert.ToString(dataRow["Town_of_Birth"])
      }).ToList();

当你读取dataRow的值时,如果某些列将返回null值,则处理null。

答案 2 :(得分:1)

您也可以使用Select()方法枚举Lamda,如下所示:

var dt = new DataTable();
var x = from a in dt.Select() where a.HasErrors == false select new Test { MyProperty = a.ItemArray.Count() };