LINQ:将任何空字符串转换为Null

时间:2017-03-27 07:18:11

标签: c# linq sqlbulkcopy

我有一个填充了大量数据和超过一百列的列表。我必须将整个列表转换为DataTable并使用SQLBulkCopy批量插入数据库中的所有数据。

除了某些字段可能为空外,一切都还可以。由于某些原因,一些空字段在转换为DataTable和SQLBulkCopy插入期间会导致一些格式异常。在一些R& D之后,我发现将空字段转换为NULL可以解决使用SQLBulkCopy批量插入的问题。

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

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

2 个答案:

答案 0 :(得分:1)

您已经循环遍历每个列/行组合以转换为DataTable,您可以向该函数添加新参数,Func<object, object>您在每个单元格上执行在该函数中,您检查该值是否为空,因此将其替换为 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;
            });

答案 1 :(得分: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),其中字段为&#34; Name&#34;将包含字段名称上每个空值的空值。 此外,您必须使用相同的条件语句

声明要转换空字符串的每个字段