【问题标题】:LINQ: Convert any empty string to NullLINQ:将任何空字符串转换为 Null
【发布时间】:2017-03-27 16:09:22
【问题描述】:

我有一个包含大量数据和一百多列的列表。我必须将整个列表转换为 DataTable 并使用SQLBulkCopy 将所有数据批量插入数据库。

一切都很好,只是有些字段可能为空。并且由于某种原因,某些空字段在转换为 DataTable 后以及在SQLBulkCopy 插入期间会导致一些格式异常。经过一番研发,我发现将空字段转换为NULL可以解决使用SQLBulkCopy批量插入的问题。

在将列表转换为 DataTable 之前,有什么方法可以使用 LINQ 查找列表中的空字段并将它们转换为 NULL 或 DBNULL?

即使我要将列表转换为 DataTable,但我不想循环每一行和每个单元格以检查单元格是否为空并转换为 null,因为它会在数据时对性能产生很大影响太多了。

【问题讨论】:

  • @MrinalKamboj:这是关于将空的 sequence 转换为单项序列,其中项是元素类型的默认值。根本不是一回事。
  • 发布表架构、数据样本和完整异常。是否违反约束?无效的演员表?还有什么?如果基础表是nvarcharvarchar 表,您不必 将空字符串转换为NULL。存储 null 是一种 hack - 你根本不存储任何东西,而不是解决问题。期望字段包含空字符串的应用程序或查询将崩溃或产生错误结果
  • 您是否正在尝试将字符串存储到数字字段中?
  • @JonSkeet,感谢您指出我的错误,不正确的 API,用于加入操作
  • 空字符串从何而来?它可能是 CSV 中的缺失值吗?在这种情况下,您可以修改 csv 读取代码,为缺少的数值返回 NULL,甚至可以直接将值转换为可为空的数字

标签: c# linq sqlbulkcopy


【解决方案1】:

我只能回答第一部分,您可以使用条件语句将所有空字符串字段替换为 Null 值

public class Person
{
    public string Sex { get; set; }
    public string Name { get; set; }
}
private static void LinQ3()
{
    var namesList = new List<Person>();
    namesList.Add(new Person() { Sex = "M", Name = "Jonh" });
    namesList.Add(new Person() { Sex = "F", Name = string.Empty });
    namesList.Add(new Person() { Sex = "M", Name = string.Empty });

    var nullV = namesList.Select(x => new {
        Sex=x.Sex,
        nullableName= string.IsNullOrWhiteSpace(x.Name)?null: x.Name
    });
}

这将返回一个列表(nullV),其中字段“名称”将包含字段名称上每个空值的空值。 此外,您必须使用相同的条件语句声明要转换空字符串的每个字段

【讨论】:

    【解决方案2】:

    您已经循环遍历每个列/行组合以转换为DataTable,您可以向该函数添加一个新参数Func&lt;object, object&gt;,您在每个单元格上执行并在该函数中检查是否该值为空,因此将其替换为 NULL

    public DataTable ConvertToDataTable<T>(List<T> list, Func<object, object> transform)
    {
       // logic
       object value = getUsingReflaction(); // ignore for now
    
       if(transform != null)
          value = transform(object);
       // continue
    }
    

    用法:

    ConvertToDataTable(myList, o => 
                {
                    if (o is string && (string)o == String.Empty)
                        return DBNull.Value;
                    else return o;
                });
    

    【讨论】:

    • 为什么要替换任何东西? SqlBulkCopy 可以将空字符串存储到文本字段中。除非它是应该存储在数字字段中的缺失值。
    • @PanagiotisKanavos 这就是 OP 想要做的。
    • 有句老话 - OP 可能会问如何跳下悬崖。存储一个 NULL 而不是一个空字符串,当一个空字符串 is 预期可能会导致麻烦。另一方面,如果源数据是 CSV 中的可选数字字段,为什么不转换为例如 int? 而不是字符串和空值?你的 sn-p 可以产生一个实际的解决方案,而不是掩盖问题
    • @PanagiotisKanavos 他不是在跳崖。做一件事总是有很多方法,我从来没有说过他想用的方法是最好的,但它可能是最有效的,因为他已经在循环使用这种方法。
    猜你喜欢
    • 1970-01-01
    • 2022-01-08
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多