2013-03-22 106 views
0

我需要一些性能来完成我的一些事情。我试图将excel数据导入到我的SQL Server数据库中,这里是我做这项工作的代码,但这确实需要太多时间。你能给我一些建议该SqlBulkCopy之后的实体框架性能

[WebMethod] 
    public static string VerileriAktar(string alanlar, string gruplar, string shit) 
    { 
     ArtiDBEntities entity = new ArtiDBEntities(); 
     string[] eslesmeler = alanlar.Split(','); 
     string[] grplar = gruplar.Split(','); 

     DataSet ds = (DataSet)HttpContext.Current.Session["ExcelVerileri"]; 
     DataTable dt = ds.Tables["" + shit + ""]; 
     MembershipUser gelen = (MembershipUser)HttpContext.Current.Session["kimo"]; 
     Guid aa = (Guid)gelen.ProviderUserKey; 


     List<tbl_AltMusteriler> bulkliste = new List<tbl_AltMusteriler>(); 
     List<tbl_AltMusteriler> ilkkontrol = entity.tbl_AltMusteriler.Where(o => o.UserId == aa).ToList(); 
     List<tbl_AltMusteriler> grupicin = new List<tbl_AltMusteriler>(); 
     List<tbl_OzelAlanlar> ensonatilacakalan = new List<tbl_OzelAlanlar>(); 
     List<tbl_OzelTarihler> ensonalicaktarih = new List<tbl_OzelTarihler>(); 

     // Datatable mın Kolon isimlerini değiştirdim. 
     foreach (string item_col_name in eslesmeler) 
     { 
      string alan = item_col_name.Split('=')[0].Split('_')[1]; 
      string degisecek = item_col_name.Split('=')[1]; 
      if (degisecek == "") 
       continue; 
      dt.Columns[degisecek].ColumnName = alan; 
     } 



     #region verilerde 

     foreach (DataRow dr in dt.Rows) 
     { 

      tbl_AltMusteriler yeni = new tbl_AltMusteriler(); 


      foreach (DataColumn dtclm in dt.Columns) 
      { 
       string gsm1 = ""; 
       if (dtclm.ColumnName == "gsm1") 
        gsm1 = dr["gsm1"].ToString(); 

       string gsm2 = ""; 
       if (dtclm.ColumnName == "gsm2") 
        gsm2 = dr["gsm2"].ToString(); 
       string ad = ""; 
       if (dtclm.ColumnName == "ad") 
        ad = dr["ad"].ToString(); 
       string soyad = ""; 
       if (dtclm.ColumnName == "soyad") 
        soyad = dr["soyad"].ToString(); 

       if (gsm1 != "") 
       { 
        if (Tools.isNumber(gsm1) == false) 
         continue; 
        else 
        { 
         if (gsm1.Length > 10) 
          gsm1 = gsm1.Substring(1, 10); 
         yeni.Gsm1 = gsm1; 

        } 
       } 

       if (gsm2 != "") 
       { 
        if (Tools.isNumber(gsm2) == false) 
         continue; 
        else 
        { 
         if (gsm2.Length > 10) 
          gsm2 = gsm2.Substring(1, 10); 
         yeni.Gsm2 = gsm2; 
        } 
       } 

       if (ad != "") 
        yeni.Ad = ad; 
       if (soyad != "") 
        yeni.Soyad = soyad; 
      } 

      yeni.UserId = new Guid(aa.ToString()); 

      if (yeni.Gsm1 != "") 
       grupicin.Add(yeni);    

     } 
     #endregion 



     bulkliste = grupicin.GroupBy(cust => cust.Gsm1).Select(grp => grp.First()).ToList();   

     List<tbl_AltMusteriler> yokartikin = bulkliste.Where(o => !ilkkontrol.Any(p => o.Gsm1 == p.Gsm1)).ToList(); 

     int saybakim = yokartikin.Count(); 

     DataTable bulkdt = new DataTable(); 
     if (yokartikin.Count > 0) 
     { 
      Type listType = yokartikin.ElementAt(0).GetType();    
      PropertyInfo[] properties = listType.GetProperties(); 
      foreach (PropertyInfo property in properties) 
       if (property.Name == "UserId") 
        bulkdt.Columns.Add(new DataColumn() { ColumnName = property.Name, DataType = typeof(Guid) }); 
       else 
        bulkdt.Columns.Add(new DataColumn() { ColumnName = property.Name }); 
      foreach (object itembulk in yokartikin) 
      { 
       DataRow drbk = bulkdt.NewRow(); 
       foreach (DataColumn col in bulkdt.Columns) 
        drbk[col] = listType.GetProperty(col.ColumnName).GetValue(itembulk, null); 
       bulkdt.Rows.Add(drbk); 
      } 
     } 


     //var rowsOnlyInDt1 = bulkdt.AsEnumerable().Where(r => !bulkdt44.AsEnumerable() 
     //  .Any(r2 => r["gsm1"].ToString() == r2["gsm1"].ToString())); 

     //DataTable result = rowsOnlyInDt1.CopyToDataTable();//The third table 

     if (bulkdt.Rows.Count > 0) 
     { 
      using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ArtiDBMemberShip"].ConnectionString)) 
      { 
       SqlTransaction transaction = null; 
       connection.Open(); 
       try 
       { 
        transaction = connection.BeginTransaction(); 
        using (var sqlBulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.TableLock, transaction)) 
        { 
         sqlBulkCopy.BulkCopyTimeout = 240; 
         sqlBulkCopy.DestinationTableName = "tbl_AltMusteriler"; 
         sqlBulkCopy.ColumnMappings.Add("UserId", "UserId"); 
         sqlBulkCopy.ColumnMappings.Add("Ad", "Ad"); 
         sqlBulkCopy.ColumnMappings.Add("Soyad", "Soyad"); 
         sqlBulkCopy.ColumnMappings.Add("Adres", "Adres"); 
         sqlBulkCopy.ColumnMappings.Add("Gsm1", "Gsm1"); 
         sqlBulkCopy.ColumnMappings.Add("Gsm2", "Gsm2"); 
         sqlBulkCopy.ColumnMappings.Add("Faks", "Faks"); 
         sqlBulkCopy.ColumnMappings.Add("Telefonis", "Telefonis"); 
         sqlBulkCopy.ColumnMappings.Add("Telefonev", "Telefonev"); 
         sqlBulkCopy.ColumnMappings.Add("Eposta", "Eposta"); 
         sqlBulkCopy.ColumnMappings.Add("DogumTarihi", "DogumTarihi"); 
         sqlBulkCopy.ColumnMappings.Add("EvlilikTar", "EvlilikTar"); 
         sqlBulkCopy.ColumnMappings.Add("TcNo", "TcNo"); 
         //sqlBulkCopy.ColumnMappings.Add("Deleted", "Deleted"); 
         sqlBulkCopy.WriteToServer(bulkdt); 

        } 
        transaction.Commit(); 
       } 
       catch (Exception) 
       { 
        transaction.Rollback(); 
       } 

      } 

      entity.SaveChanges(); 
     } 

     if (grplar.Length > 0) 
     { 
      List<tbl_AltMusteriler> guncelliste = entity.tbl_AltMusteriler.Where(o => o.UserId == aa).ToList(); 
      List<tbl_KisiGrup> kisigruplari = new List<tbl_KisiGrup>(); 
      foreach (tbl_AltMusteriler itemblkliste in bulkliste) 
      { 
       long AltMusteriIDsi = guncelliste.Where(o => o.Gsm1 == itemblkliste.Gsm1).FirstOrDefault().AltMusteriID; 

       // Seçili Gruplara kişileri ekleme 
       #region Gruplara ekleme 


       if (grplar.Length > 0) 
       { 
        foreach (string item_gruplar in grplar) 
        { 
         if (item_gruplar == "chkall") 
          continue; 
         if (item_gruplar == "") 
          continue; 
         if (item_gruplar == null) 
          continue; 

         tbl_KisiGrup yeni_kisi_grup = new tbl_KisiGrup() 
         { 
          AltMusteriID = AltMusteriIDsi, 
          GrupID = int.Parse(item_gruplar) 
         }; 
         kisigruplari.Add(yeni_kisi_grup); 
        } 
       } 
       #endregion 
      } 

      List<tbl_KisiGrup> guncel_grup = entity.tbl_KisiGrup.Where(o => o.tbl_AltMusteriler.UserId == aa).ToList(); 

      List<tbl_KisiGrup> kisi_grup_kaydet = kisigruplari.Where(o => !guncel_grup.Any(p => o.AltMusteriID == p.AltMusteriID && o.GrupID == p.GrupID)).ToList(); 

      // Grupları Datatable çevirme 
      #region Grupları Datatable le çevirme 
      DataTable bulkdt2 = new DataTable(); 



      if (kisi_grup_kaydet.Count > 0) 
      { 
       Type listType = kisi_grup_kaydet.ElementAt(0).GetType(); 
       //Get element properties and add datatable columns 
       PropertyInfo[] properties = listType.GetProperties(); 
       foreach (PropertyInfo property in properties) 
        bulkdt2.Columns.Add(new DataColumn() { ColumnName = property.Name }); 
       foreach (object itembulk in kisi_grup_kaydet) 
       { 
        DataRow drbk = bulkdt2.NewRow(); 
        foreach (DataColumn col in bulkdt2.Columns) 
         drbk[col] = listType.GetProperty(col.ColumnName).GetValue(itembulk, null); 
        bulkdt2.Rows.Add(drbk); 
       } 
      } 
      #endregion 


      //Burada bulk insert işlemini gerçekleştiriyoruz... 
      #region Grup Verileri BulkCopy ile birkerede yazdık 

      using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["ArtiDBMemberShip"].ConnectionString)) 
      { 
       SqlTransaction transaction = null; 
       connection.Open(); 
       try 
       { 
        transaction = connection.BeginTransaction(); 
        using (var sqlBulkCopy = new SqlBulkCopy(connection, SqlBulkCopyOptions.TableLock, transaction)) 
        { 
         sqlBulkCopy.BulkCopyTimeout = 240; 
         sqlBulkCopy.DestinationTableName = "tbl_KisiGrup"; 
         sqlBulkCopy.ColumnMappings.Add("AltMusteriID", "AltMusteriID"); 
         sqlBulkCopy.ColumnMappings.Add("GrupID", "GrupID"); 
         sqlBulkCopy.WriteToServer(bulkdt2); 
        } 
        transaction.Commit(); 
       } 
       catch (Exception) 
       { 
        transaction.Rollback(); 
       } 

      } 

      entity.SaveChanges(); 
      #endregion 


     } 

     return "ok"; 

    } 

编辑

实际上是代码块需要一定的时间,如果有70.000或多行数据

List<tbl_AltMusteriler> yokartikin = bulkliste.Where(o => !ilkkontrol.Any(p => o.Gsm1 == p.Gsm1)).ToList(); 

我想我的主要问题是,当而我只是用sqlbulkcopy插入数据。之后,我无法获得身份ID,因此,我将数据获取到通用列表并尝试查找新ID并创建组的新列表。再次sqlbulkcopy。这些都需要大量的时间大约10分钟进口65.000行是否有另一种方式来做那些事

+2

请尝试将该代码示例减少到可管理的程度。这是一个很大的问题,大部分似乎与你使用实体框架没有任何关系。另外,你是否做过任何测试以确定哪些呼叫或呼叫实际上比他们应该花费的时间更长? – 2013-03-22 21:44:03

回答

0

您的问题是非常广泛的。我会推荐阅读performance considerations for EF。另外请记住,EF并非真正意味着批量操作,因为它将数据库中的所有数据都带到了客户端。如果你不想/需要在客户端上处理它们,如果你想为许多实体执行此操作,则会增加很多开销。 (请注意,我没有真正查看您的代码 - 它太多了)