C# 转换列表<;X>;到DBDataReader

C# 转换列表<;X>;到DBDataReader,c#,entity-framework,sqlbulkcopy,dbdatareader,C#,Entity Framework,Sqlbulkcopy,Dbdatareader,如何将列表个人列表转换为DBDataReader 在下面给出的代码中,我正在尝试批量插入personList。我有大约500k条记录,方法WriteToServer需要一个DBDataReader,我有一个列表。如何将List转换为DBDataReader using (SqlBulkCopy bc= new SqlBulkCopy(constr)) { bc.DestinationTableName = "MyPersonTable"; try {

如何将
列表个人列表
转换为
DBDataReader

在下面给出的代码中,我正在尝试批量插入
personList
。我有大约500k条记录,方法
WriteToServer
需要一个DBDataReader,我有一个
列表
。如何将
List
转换为
DBDataReader

using (SqlBulkCopy bc= new SqlBulkCopy(constr)) {
      bc.DestinationTableName = "MyPersonTable";
       try
       {
             bc.WriteToServer(personList);
       }
       catch (Exception ex)
       {
             Console.WriteLine(ex.Message);
       }
}\
\


您可以使用此选项,然后使用SqlBulkCopy将所有数据插入数据库:

 IList<Name> list = new List<Name>();
    list.Add(new Name{ Forename="Bert", Surname="Fred"});

    list.Add(new Name { Forename = "John", Surname = "Smith" });
    DataTable table = new DataTable();
    table.Columns.Add("Forename");
    table.Columns.Add("Surname");

    foreach (Name item in list)
    {
        var row = table.NewRow();

        row["Forename"] = item.Forename;
        row["Surname"] = item.Surname;

        table.Rows.Add(row);
    }
IList list=new list();
添加(新名称{Forename=“Bert”,姓氏=“Fred”});
添加(新名称{Forename=“John”,姓氏=“Smith”});
DataTable=新的DataTable();
表.列.添加(“名称”);
表.列.添加(“姓氏”);
foreach(列表中的名称项)
{
var row=table.NewRow();
行[“Forename”]=项。Forename;
行[“姓氏”]=项。姓氏;
table.Rows.Add(行);
}

以下是创建表的一般方法

还有另一种方法可以做到这一点,即创建一个自定义类,该类继承自
IDataReader
,如果您对它感兴趣,请随意告诉我

无论如何,看看下面,这是一种方式

public static DataTable MakeTable(this List<object> o)
{
  var data = new DataTable();
  var props = o.FirstOrDefault()?.GetType().GetProperties();
  if (props == null)
      return data;
  forEach(var p in props){
        DataColumn c = new DataColumn();
        c.DataType = p.PropertyType;
        c.ColumnName = p.Name;
        // c.AutoIncrement = true; // if this is a primaryKey 
        data.Columns.Add(c);
  }

  forEach(var item in o){
    var row = data.NewRow();
    forEach(var p in props){
     row[p.Name] = p.GetValue(item);
     }
     data.Rows.Add(row);
  }
  return data;
}
   // now all you need is to call MakeTable
   using (SqlBulkCopy bc= new SqlBulkCopy(constr)) {
      bc.DestinationTableName = "MyPersonTable";
       try
       {
             bc.WriteToServer(personList.MakeTable());
       }
       catch (Exception ex)
       {
             Console.WriteLine(ex.Message);
       }
}
公共静态数据表MakeTable(此列表为o)
{
var data=new DataTable();
var props=o.FirstOrDefault()?.GetType().GetProperties();
if(props==null)
返回数据;
forEach(道具中的var p){
DataColumn c=新的DataColumn();
c、 数据类型=p.PropertyType;
c、 ColumnName=p.名称;
//c.AutoIncrement=true;//如果这是primaryKey
数据。列。添加(c);
}
forEach(o中的var项){
var row=data.NewRow();
forEach(道具中的var p){
行[p.Name]=p.GetValue(项目);
}
data.Rows.Add(行);
}
返回数据;
}
//现在您只需要调用MakeTable
使用(SqlBulkCopy bc=新的SqlBulkCopy(constr)){
bc.DestinationTableName=“MyPersonTable”;
尝试
{
WriteToServer(personList.MakeTable());
}
捕获(例外情况除外)
{
控制台写入线(例如消息);
}
}

也许吧?乍一看,我看到它甚至提到了批量复制。我只是在我的类中粘贴了这个方法,并删除了static关键字。我得到以下错误
严重性代码描述项目文件行抑制状态错误CS1106扩展方法必须在非通用静态类中定义
Yepp正如它所说的,从参数中删除
:)我已用个人模型更新了我的帖子。我不明白如何为Person模型添加数据类型和ColumnName。请帮帮我。什么意思,数据类型和列名已经添加了。如果propertyName和DataTable与数据库中的DataTable相同,那么它应该可以工作。查看行
c.ColumnName=p.PropertyName这里是我分配ColumnName的地方自动递增部分是如何工作的?我这里只有
personId
作为主键。如果我取消注释该行,其他字段会受到影响吗?
public static DataTable MakeTable(this List<object> o)
{
  var data = new DataTable();
  var props = o.FirstOrDefault()?.GetType().GetProperties();
  if (props == null)
      return data;
  forEach(var p in props){
        DataColumn c = new DataColumn();
        c.DataType = p.PropertyType;
        c.ColumnName = p.Name;
        // c.AutoIncrement = true; // if this is a primaryKey 
        data.Columns.Add(c);
  }

  forEach(var item in o){
    var row = data.NewRow();
    forEach(var p in props){
     row[p.Name] = p.GetValue(item);
     }
     data.Rows.Add(row);
  }
  return data;
}
   // now all you need is to call MakeTable
   using (SqlBulkCopy bc= new SqlBulkCopy(constr)) {
      bc.DestinationTableName = "MyPersonTable";
       try
       {
             bc.WriteToServer(personList.MakeTable());
       }
       catch (Exception ex)
       {
             Console.WriteLine(ex.Message);
       }
}