Как вставить модель из таблицы сопоставления - PullRequest
0 голосов
/ 19 октября 2018

У меня есть идея вставить мою модель из Excel, используя отображение из таблицы.Потому что мой Excel HV более 100 столбцов.Будет уставать, если я буду писать код вручную, как я.У меня есть идея сохранить в базе данных имя заголовка Excel, функцию и строку для моей таблицы

Сначала я читаю свой Excel, затем захват в набор данных, затем foreach набор данных, затем для каждого отображения списка, затем с помощьюесли знать, пусто или нет, то читать функцию, используя замену, затем установить модель, используя таблицу сопоставления

Что я делаю:

[HttpPost]
public ActionResult upload(HttpPostedFileBase uploadFile)
{
    private DB_Entities db = new DB_Entities();
    dataset ds = new dataset();
    ds = GetFileExcel(uploadFile);

    foreach (DataRow dr in ds.Tables["Header$"].Rows)
    {   
        tbl_header header = new tbl_header();

        string name = dr["Name"].ToString();
        if (name != "") {
            var resultName = Convert.ToInt32(name);
            header.name = resultName;
        }

        string address = dr["Address"].ToString();
        if (address != "") {
            var resultAddress = DateTime.ParseExact(address, "dd MMM yyyy", provider);
            header.address = resultAddress;
        }

        string country = dr["Country"].ToString();
        if (country != "") {
            var resultCountry = db.tbl_Item.Where(a => a.Code == country).Select(a => a.Id).SingleOrDefault();
            header.country = ResultCountry;
        }

        db.tbl_header.Add(header);
        db.SaveChanges();
    }
}

public partial class tblT_Pengeluaran_Header
{
    public int name { get; set; }
    public DateTime address { get; set; }
    public int country { get; set; }
}

Что я хочу:

[HttpPost]
public ActionResult upload(HttpPostedFileBase uploadFile)
{
    private DB_Entities db = new DB_Entities();
    dataset ds = new dataset();
    ds = GetFileExcel(uploadFile);
    var mapping = db.Tbl_Mapping.toList();

    foreach (DataRow dr in ds.Tables["Header$"].Rows)
    {
        tbl_header header = new tbl_header();

        //foreach list mapping to doing:
        //{
        //    string excel = ReadExcel
        //    if (excel != "") {
        //        string resultFunction = ReadFunction.Replace('[data]',excel);
        //        var result = Execute(resultFunction);
        //        header.ReadTable = result;
        //    }
        //} 

        db.tbl_header.Add(header);
        db.SaveChanges();
    }
}

Таблица сопоставления Пример: Tbl_Mapping

table   | excel     | function
_____________________________________
name    | Name      | Convert.ToInt32([data]);
address | Address   | DateTime.ParseExact([data], "dd MMM yyyy", provider);
country | Country   | db.tbl_Item.Where(a => a.Code == [data]).Select(a => a.Id).SingleOrDefault();
.....
.....

Как это сделать?любая идея???Спасибо

1 Ответ

0 голосов
/ 19 октября 2018

Я вижу две проблемы в вашем коде.

  1. Выбор объекта страны из базы данных в пределах foreach
  2. Сохранение БД в пределах foreach.

Оба выше сказываются на производительности.Вместо этого рассмотрим приведенное ниже.

Сначала выберите все страны из набора данных, выполните поиск в одной БД и используйте AddRange вместо add.

Для преобразования набора данных в сопоставление объектов используйте Linq, как показано ниже.

[HttpPost]
public ActionResult upload(HttpPostedFileBase uploadFile)
{
    private DB_Entities db = new DB_Entities();

    DataSet ds = GetFileExcel(uploadFile);

    string[] countryCodes = ds.Tables["Header$"].AsEnumerable().Select(row => row.Field<string>("country")).ToArray();

    var selectedCountries = db.tbl_Item.Where(q => countryCodes.Contains(q)).Select(s => new { Id = s.Id, Code = s.Code }).ToList();

    List<tbl_header>  headers = ds.Tables["Header$"].AsEnumerable().Select
    (
        row => new tbl_header
        {
            name = row.Field<string>("Name") == string.Empty ? 0 : int.Parse(row.Field<string>("Name")),
            address = row.Field<string>("Address") == string.Empty ? DateTime.MinValue : DateTime.ParseExact((row.Field<string>("Address")), "dd MMM yyyy", provider),
            country = selectedCountries.SingleOrDefault(q=> q.Code == row.Field<string>("Country")).Id
        }
    ).ToList();

    db.tbl_header.AddRange(headers);
    db.SaveChanges();
}
...