Помогите мне устранить лишний код - PullRequest
0 голосов
/ 21 апреля 2010

У меня есть страница 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-файла.

Есть предложения?

EDIT: Вот что я ищу ... но я не знаю, как делать строки 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 Ответ

2 голосов
/ 21 апреля 2010

Я думаю, вы могли бы сделать это, извлекая объекты 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>();

Это близко к тому, что вы ищете? Добавить комментарий, если нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...