如何将包含自定义调用的代码合并到一个常用方法中?

时间:2014-02-11 20:41:44

标签: c# entity-framework csv

我总是使用类似的代码从csv文件播种许多数据库表。每个表只有两件事情发生变化(见下文)。您是否认为有任何方法可以将表格种子合并到一个通用方法中以获得更清晰的代码?

将文件名作为常用方法的参数很容易。但我不知道如何处理AddOrUpdate()调用。表的列数和列类型不同。

非常感谢任何想法。

using (var parser = new TextFieldParser("file1.csv") // #### this file name ####
{
  parser.TextFieldType = FieldType.Delimited;
  parser.SetDelimiters(",");

  while (!parser.EndOfData)
  {
    string[] fields = parser.ReadFields();
    context.Table1.AddOrUpdate(c => c.Col1,
      new Table1Type() { Col1 = Convert.ToInt32(fields[0]), Col2 = fields[1] });
      // #### this row ####
  }
}  

1 个答案:

答案 0 :(得分:0)

AddOrUpdate只需要一个Func签名返回一个对象,因此您可以创建一个自定义方法或类,将文件名作为参数,以及如何为该对象构建对象的函数AddOrUpdate调用另一个参数。

private void DoWork(string fileName, Func<string[], object> fieldParser)
{
    using (var parser = new TextFieldParser(fileName))
    {
        parser.TextFieldType = FieldType.Delimited;
        parser.SetDelimiters(",");

        while (!parser.EndOfData)
        {
            string[] fields = parser.ReadFields();
            context.Table1.AddOrUpdate(c => c.Col1, fieldParser(fields));
        }
    }
}

这样打电话:

DoWork("file1.csv", fields => { new Table1Type() { Col1 = Convert.ToInt32(fields[0]), Col2 = fields[1] });

这可能不是完全正确,因为我不知道你的数据库上下文结构,但这是在.NET中使用函数作为第一类成员的基本思想......