Pytanie wyodrębnianie wierszy i wyświetlanie wszystkich kolumn


W moim projekcie są dwa datatables dtFail i dtFailed (dtFailed nie ma nic oprócz deklaracji nazw kolumn). dtFail ma zduplikowane wartości kolumn "EmployeeName". więc wziąłem danych dvFail i wykonał proces, aby odróżnić je, jak pokazano w poniższym kodzie:

dtFail

enter image description here

Próbowałem poniższy kod:

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

dtFailed (tylko jedna kolumna)

enter image description here

Jeśli podoba mi się poniżej

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

dtFailed (wyświetlane, ale z duplikatami wierszy)

enter image description here

Następnie datatable dtFailed przechowuje również duplikat "EmployeeName".

Proszę pomóż
Z góry dziękuję.


12
2017-10-20 07:56


pochodzenie


Potrzebujesz więcej informacji - czy możesz wkleić niektóre przykładowe dane pokazujące, jakie dane znajdują się w tabeli dvFail? - Sachin Shanbhag
@SachinShanbhag sprawdź moje edytowane pytanie - Mr_Green


Odpowiedzi:


Wypróbuj to zapytanie

DataTable distinctTable = originalTable.DefaultView.ToTable( /*distinct*/ true);

Aby uzyskać więcej informacji, kliknij poniżej link-

https://social.msdn.microsoft.com/Forums/en-US/ed9c6a6a-a93e-4bf5-a892-d8471b84aa3b/distinct-in-datatable-or-dataview?forum=adodotnetdataset

Mam nadzieję, że ci to pomogło.


5
2018-06-29 11:01





ROZWIĄZANIE 1:

W oparciu o moje zrozumienie, musimy wziąć pod uwagę duplikaty oparte na EmployeeName i nie musimy martwić się o inne kolumny. Jeśli tak jest, to rozwiązanie działa lepiej.

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);
      }
  }

jeśli chcesz, możesz przywrócić dt1 do dtFail.

ROZWIĄZANIE 2:

Jeśli potrzebujemy rozważyć różne wiersze, wolę poniższe rozwiązanie.

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

1
2017-07-03 14:22





Nie jestem pewien, czy to będzie pomocne, czy nie. O ile dostaję od twojego pytania, które chcesz EmployeeName być odrębnym nieistotnym dla innych kolumn. Ale jeśli to zrobisz ToTable i włącz odrębną flagę, która da wszystkie oddzielne wiersze, nie ma znaczenia, ile kolumn jest tam zaangażowanych. Jeśli więc wspomnisz tylko EmployeeName, to oczywiście dostarczysz różne EmployeeNames, nie wszystkie kolumny z nim związane.

Tak, to co zrobiłem, początkowo wybrać tylko różne EmployeeName kolumn i umieścić go w temp DataTable dtt.

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

Po drugie utworzyłem kolejną temp DataTable, w której umieszczamy posegregowane wiersze z głównego DataTable dtFail i ręcznie ustawiamy nazwy kolumn.

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

Przygotuj kolumny w DtFailed DataTable.

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

Przeprowadź pętlę przez odrębną nazwę EmployeeName dtt DataTable i dopasuj nazwę EmployeeName i zachowaj wybraną first wiersz w TempDataTable. W końcu wszystkie wiersze zostały przeniesione do pliku 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);
     }

0
2018-06-30 04:33