我正在尝试将DataTable
转换为通用列表List<T>
,我收到此错误:
无法将lambda表达式转换为字符串类型,因为它不是a 委托类型
我已经在SO上发布过关于此问题的几个主题,其中大多数建议使用Entity
和Linq 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();
答案 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() };