2012-10-20 15 views
12

Nel mio progetto ci sono due datatables dtFail e dtFailed (dtFailed non ha nient'altro che dichiarazioni di nomi di colonne). dtFail ha valori di colonna "EmployeeName" duplicati. così ho preso un dataview dvFail e fatto il processo per renderli distinti come mostrato nel seguente codice:rendendo le righe distinte e mostrando tutte le colonne

dtFail

enter image description here

Ho provato il codice qui sotto:

DataView dvFail = new DataView(dtFail); 
    dtFail = dvFail.ToTable(true, "EmployeeName"); //showing only one column in dtFail 

dtFailed (solo una colonna)

enter image description here

Se faccio come sotto

DataView dvFail = new DataView(dtFail); 
    dtFail = dvFail.ToTable(true, "EmployeeName","EmployeeRole","Status"); 

dtFailed (mostrando ma con righe duplicate)

enter image description here

Poi datatable dtFailed sta memorizzando duplicare " EmployeeName "anche.

Please Help
Grazie in anticipo.

+0

Ulteriori informazioni: puoi incollare alcuni dati di esempio che mostrano quali sono i dati nella tabella dvFail? –

+0

@SachinShanbhag controlla la mia domanda modificata –

risposta

0

Non sono sicuro che sarà utile o meno. Per quanto mi risulta dalla tua domanda, vuoi che lo EmployeeName diventi irrilevante per le altre colonne. Ma se si fa ToTable e si attiva il flag distinto, verranno assegnate tutte le righe distinte, non importa quante colonne sono coinvolte. Quindi, se si menziona solo EmployeeName, questo ovviamente ti darà EmployeeNames distinti, non tutte le colonne ad esso associate.

Quindi, questo è quello che ho fatto, inizialmente selezionare solo le distinte colonne EmployeeName e metterlo in un temp DataTable dtt.

DataTable dtt = dvFail.DefaultView.ToTable(true, "EmployeeName"); 

In secondo luogo ho creato un altro DataTable temporaneo dove abbiamo messo le righe separate dalla principale DataTable dtFail e impostare manualmente i nomi delle colonne.

DataTable TempDataTable = new DataTable(); 
DataTable dtFailed = new DataTable(); 

Preparare le colonne nel dtFailed DataTable.

 if (dtFailed.Columns.Count == 0) 
    { 
      dtFailed.Columns.Add("EmployeeName"); 
      dtFailed.Columns.Add("EmployeeRole"); 
      dtFailed.Columns.Add("Status"); 
      dtFailed.Columns.Add("Date"); 
    } 

Loop attraverso il distinto EmployeeName dtt DataTable e corrisponde al EmployeeName e mantenere quella selezionata first riga nella TempDataTable. Finalmente tutte le righe trasferite nel dtFailed.

 for (int j = 0; j < dtt.Rows.Count; j++) 
    { 
      string EmployeeName = dtt.Rows[j]["EmployeeName"].ToString(); 
      TempDataTable = dvFail.Select("EmployeeName = " + EmployeeName).CopyToDataTable(); 
      dtFailed.Rows.Add(TempDataTable.Rows[0].ItemArray); 
    } 
1

SOLUZIONE 1:

Sulla base della domanda la mia comprensione è, dobbiamo considerare i duplicati in base EmployeeName e non dobbiamo preoccuparci altre colonne. Se questo è il caso, la soluzione funziona meglio.

foreach(DataRow r in dtFail.AsEnumerable()) 
    { 
    if (!dt1.AsEnumerable().Any(r1 => r1["EmployeeName"] == r["EmployeeName"])) 
     { 
    // if you don't want to copy entire row create new DataRow 
    // with required fields and add that row. 
     dt1.Rows.Add(r.ItemArray); 
     } 
    } 

se si desidera è possibile reinserire dt1 su dtFail.

SOLUZIONE 2:

Se abbiamo bisogno di prendere in considerazione righe distinte preferisco sotto soluzione.

var temp = dtFail.AsEnumerable().Distinct(); 
dtFail = temp.CopyToDataTable();