Делая строки отличными и отображая все столбцы

В моем проекте есть два типа данных dtFail и dtFailed (dtFailed не имеет ничего, кроме объявлений имен столбцов). dtFail имеет повторяющиеся значения столбца "EmployeeName". поэтому я взял dataview dvFail и сделал процесс, чтобы сделать их отличными, как показано в приведенном ниже коде:

dtFail

enter image description here

Я попробовал код ниже:

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

dtFailed (только один столбец)

enter image description here

Если мне нравится ниже

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

dtFailed (показывается только с повторяющимися строками)

enter image description here

Затем datatable dtFailed также хранит дубликат "EmployeeName".

Пожалуйста, помогите
Спасибо в Advance.

Ответ 2

РЕШЕНИЕ 1:

Основываясь на вопросе, который я понимаю, нам нужно рассмотреть дубликаты на основе EmployeeName, и нам не нужно беспокоиться о других столбцах. Если это так, то решение работает лучше.

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

если вы хотите, вы можете вернуть dt1 обратно в dtFail.

РЕШЕНИЕ 2:

Если нам нужно рассмотреть отдельные строки, я предпочитаю ниже решение.

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

Ответ 3

Я не уверен, что это будет полезно или нет. Насколько я понял из вашего вопроса, что вы хотите, чтобы EmployeeName отличался от других столбцов. Но если вы сделаете ToTable и включите отдельный флаг, он даст все отдельные строки, неважно, сколько там столбцов. Поэтому, если вы упомянете только имя EmployeeName, оно, очевидно, даст вам отличные имена EmployeeNames, а не все связанные с ним столбцы.

Итак, вот что я сделал, изначально выбираем только отдельные столбцы EmployeeName и помещаем их в temt DataTable dtt.

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

Во-вторых, я создал другую временную таблицу DataTable, где мы помещаем выделенные строки из основного DataTable dtFail и задаем имена столбцов вручную.

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

Подготовьте столбцы в dtFailed DataTable.

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

Пройдите через отдельный DataTable EmployeeName dtt и сопоставьте имя EmployeeName и сохраните выбранную строку first в TempDataTable. Наконец, все строки переданы в 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);
     }