You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C#中DataTable转换为List<T>报错:无法将lambda表达式转为string

解决DataTable转List时的Lambda表达式转换错误

这个问题我之前也碰到过,其实核心原因是DataTable本身不支持直接的Linq查询——它没有实现IEnumerable<T>接口,导致编译器没法正确解析你的查询语法,才会抛出那个看起来有点迷惑的“无法将lambda表达式转换为string”错误。下面是具体的解决步骤和修正后的代码:

1. 确保必备的引用和命名空间

首先要确认你的项目已经添加了以下内容:

  • 引用System.Data.DataSetExtensions程序集(很多人会漏掉这个,它提供了DataTable的Linq扩展方法)
  • 在代码文件顶部添加两个关键命名空间:
    using System.Linq;
    using System.Data;
    

2. 修正Linq查询代码

你需要先调用DataTable的AsEnumerable()方法,把它转换成支持Linq查询的EnumerableRowCollection<DataRow>类型,然后再通过Select映射到你的MyClass对象。另外,访问DataRow的列值时,推荐使用Field<T>()方法来做类型安全的转换(避免直接强制转换可能出现的空值或类型不匹配问题)。

修正后的代码如下:

DataTable csvData = GetDataTableFromCSVFile(csv_file_path);
List<MyClass> lst = csvData.AsEnumerable()
    .Select(row => new MyClass
    {
        Address_1 = row.Field<string>("Address_1"),
        Title = row.Field<string>("Title"),
        Town_of_Birth = row.Field<string>("Town_of_Birth")
        // 剩下的26列都按照这个格式,根据属性类型替换Field的泛型参数
        // 比如如果是整数类型:Age = row.Field<int>("Age")
        // 允许空值的话:Age = row.Field<int?>("Age")
    })
    .ToList();

额外提示

如果你的DataTable列名和MyClass的属性名完全一致,还可以用反射或者AutoMapper这类工具来自动映射,避免手动写29个属性的重复代码,比如用AutoMapper的话只需要几行配置就能完成批量映射,但手动编写的方式更直观,适合对类型转换有精确控制的场景。

内容的提问来源于stack exchange,提问作者Abdul

火山引擎 最新活动