帮我消除冗余代码

时间:2010-04-21 16:06:22

标签: .net linq-to-sql reflection

我有一个ASP.NET(3.5)页面,允许用户上传包含多个工作表的Excel 2003文件,并将该数据插入到数据库中的临时表中。数据库表/列到Excel工作表/列的映射在XML文件中指定。我使用LINQ to SQL将数据发送到数据库。

ImportTablesDataContext db = new ImportTablesDataContext();
tblImportLoan loan; // class defined by LINQ to SQL

// iterate through each row of data from the Excel worksheet called Loans
foreach (DataRow dr in _data.Tables[ExcelSheetName].Rows)
{
  loan = new tblImportLoan();

  // iterate through each column in the mapping for the Loans worksheet
  foreach (... column in mapping for this worksheet ...)
    loan.GetType().GetProperty(column.DBName).SetValue(loan, GetValue(column, dr), null);

  db.tblImportLoans.InsertOnSubmit(loan);
}

我为5个工作表中的每一个重复了大部分代码。我会喜欢遍历映射中定义的5个表的集合 - 但我无法弄清楚如何使硬编码的类名/方法/属性动态化(第2行,第7行和第13行)以上)。这将允许我避免引用XML文件之外的表名。

有什么建议吗?

修改 这是我正在寻找的......但我不知道如何做第5和第8行。

foreach (... table in mapping ...)
{
  foreach (DataRow dr in _data.Tables[table.ExcelSheetName].Rows)
  {
    obj = new <LINQ constructor derived from table name>;
    foreach (... column in mapping ...)
      obj.GetType().GetProperty(column.DBName).SetValue(obj, GetValue(column, dr), null);
    db.<LINQ property derived from table name>.InsertOnSubmit(obj);
  }
}

1 个答案:

答案 0 :(得分:2)

我认为您可以直接从Table<TEntity>检索DataContext个对象。首先,您需要将代码包装在通用方法中:

public void DoWorkFor<TEntity>()
{
    ImportTablesDataContext db = new ImportTablesDataContext();
    Table<TEntity> table = db.GetTable<TEntity>();

    // iterate through each row of data from the Excel worksheet called Loans
    foreach (DataRow dr in _data.Tables[ExcelSheetName].Rows)
    { 
        entity = new TEntity();

        // iterate through each column in the mapping for the Loans worksheet
        foreach (... column in mapping for this worksheet ...)
        {
            entity.GetType().GetProperty(column.DBName)
                .SetValue(entity, GetValue(column, dr), null);
        }

        table.InsertOnSubmit(entity);
    }
}

然后,在程序的其他地方,您需要调用此方法并提供适当的实体类型:

DoWorkFor<tblImportLoan>();
DoWorkFor<tblOtherType1>();
DoWorkFor<tblOtherType2>();
DoWorkFor<tblOtherType3>();
DoWorkFor<tblOtherType4>();

这接近你想要的吗?如果没有,请添加评论。