Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将包含自定义调用的代码合并到公共方法中?_C#_Entity Framework_Csv - Fatal编程技术网

C# 如何将包含自定义调用的代码合并到公共方法中?

C# 如何将包含自定义调用的代码合并到公共方法中?,c#,entity-framework,csv,C#,Entity Framework,Csv,我总是使用类似的代码从csv文件中植入许多数据库表。每个表只改变两件事(见下文)。您有没有发现任何方法可以将表种子设定合并到一个通用方法中以获得更干净的代码 将文件名作为通用方法的参数很容易。但我不确定如何处理AddOrUpdate()调用。表的列数和列类型不同 任何想法都值得赞赏 using (var parser = new TextFieldParser("file1.csv") // #### this file name #### { parser.TextFieldType =

我总是使用类似的代码从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 ####
  }
}  

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

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));
        }
    }
}

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

这很有帮助,非常感谢。不幸的是,这会将所有数据放入
表1
。在参数中可以引用表名吗?不容易。您可能需要反射和模式(例如表名与csv名称匹配,或者将表名作为参数传递并使用它在上下文中查找属性)。
DoWork("file1.csv", fields => { new Table1Type() { Col1 = Convert.ToInt32(fields[0]), Col2 = fields[1] });