kumari567 Ответов: 3

Разница между двумя таблицами данных в C# с использованием LINQ


II иметь две таблицы данных следующим образом
dtOne
-------------------------
  ID  |   Name
--------------------------
 101  |  ABC
 102  |  XYZ
 103  |  MNO
 104  |  PQR
--------------------------

dtTwo
-------------------------
  ID  |   Name
--------------------------
 101  |  FGH
 102  |  XYZ
 104  |  GPS
--------------------------

Я просто хочу получить результат в виде данных, которые находятся "в dtOne" и "не в dtTwo" (dtOne-dtTwo)
dtResult
-------------------------
  ID  |   Name
--------------------------
 103  |  MNO
--------------------------

Как я могу этого достичь?

Что я уже пробовал:

Я использовал кроме метода LINQ но это дает такой результат
101  |  ABC
103  |  MNO
104  |  PQR
101  |  FGH
104  |  GPS

Это означает сопоставление обоих столбцов в методе except

3 Ответов

Рейтинг:
23

Karthik_Mahalingam

попробовать это

DataTable dt1 = new DataTable();
      dt1.Columns.Add("ID");
      dt1.Columns.Add("Name");
      dt1.Rows.Add(101, "ABC");
      dt1.Rows.Add(102, "XYZ");
      dt1.Rows.Add(103, "MNO");
      dt1.Rows.Add(104, "PQR");

      DataTable dt2 = new DataTable();
      dt2.Columns.Add("ID");
      dt2.Columns.Add("Name");
      dt2.Rows.Add(101, "FGH");
      dt2.Rows.Add(102, "XYZ");
      dt2.Rows.Add(104, "GPS");


     DataTable dtOutput = dt1.Rows.OfType<DataRow>().Where(a=>  dt1.Rows.OfType<DataRow>().Select(k=>  Convert.ToInt32(k["ID"])).Except( dt2.Rows.OfType<DataRow>().Select(k=>  Convert.ToInt32(k["ID"])).ToList()).Contains( Convert.ToInt32( a["ID"]))).CopyToDataTable();


kumari567

этот код вызывает исключение.... исходная таблица не содержит ни одной строки

Karthik_Mahalingam

проверить это

if ((dt1 != null && dt1.Rows.Граф и gt; 0) и усилитель; & (ст2 != нуль &амп;&амп; ст2.Строк.Count > 0))
{
DataTable dtOutput = dt1.Rows.Метод oftype&ЛТ;строкаданных и GT;().Где(а => у ст1.Строк.Метод oftype&ЛТ;строкаданных и GT;().Выберите(к =&ГТ; преобразование.ToInt32(k["ID"])). Except(dt2.Rows.Метод oftype&ЛТ;строкаданных и GT;().Выберите(к =&ГТ; преобразование.ToInt32(k["ID"])).Толист()).Содержит(Convert.ToInt32(a["ID"]))). Copytodatable();
}

kumari567

и все же у меня есть исключение
Исключение типа 'System.InvalidOperationException' произошло в System.Data.DataSetExtensions.dll, но не был обработан в пользовательском коде

Дополнительная информация: источник не содержит потоков данных.

kumari567

мой код таков
if ((dt != null && dt.строки.Граф и gt; 0) и усилитель; & (myDataTable != нуль &амп;&амп; myDataTable.Строк.Count > 0))
{
dtExtraRowOfXml = dt.Rows.Метод oftype&ЛТ;строкаданных и GT;().Где(а => по ДТ.Строк.Метод oftype&ЛТ;строкаданных и GT;().
Выберите(k => конвертировать.ToString(k["Station"])). Except(myDataTable.Rows.Метод oftype&ЛТ;строкаданных и GT;().Выберите(к =&ГТ; преобразование.ToString(k["станция"])).Толист()).Содержит(Convert.ToString(a["станция"]))). Copytodatable();
}

Karthik_Mahalingam

попробовать это..

DataTable dtOutput = new DataTable();

if ((dt1 != null && dt1.Rows.Count > 0) && (dt2 != null && dt2.Rows.Count > 0))
{
var temp = dt1.Rows.OfType < DataRow >().Where(a => dt1.Rows.OfType < DataRow > ().Select(k => Convert.ToInt32(k["ID"])).Except(dt2.Rows.OfType < DataRow > ().Select(k => Convert.ToInt32(k["ID"])).ToList()).Contains(Convert.ToInt32(a["ID"])));
if(temp != null && temp.Count() >0)
dtOutput = temp.CopyToDataTable();
}

kumari567

это правильный код, или я должен его изменить .
Потому что я не думаю, что мы можем напрямую скопировать тип var temp в datadable
if(temp != null && temp.Count() >0)
dtOutput = temp.CopyToDataTable();

Karthik_Mahalingam

просто скопируйте и вставьте его , он будет работать. что плохого в том, чтобы попытаться..
изменить значение ID для вашего

kumari567

да я так и сделал но некоторые ошибки приближаются

Karthik_Mahalingam

опубликуйте свой код.

kumari567

сэр я написал ниже пожалуйста смотрите

Karthik_Mahalingam

попробовать это

Объект DataTable dtfinalXml;
если (dtExtraRowOfXml.Строк.Count > 0)
{
var temp = myDataTable.AsEnumerable().Union(dtExtraRowOfXml.AsEnumerable(), DataRowComparer.По умолчанию);
if (temp != null && temp.Count() > 0)
dtfinalXml = temp.CopyToDataTable();
}



держите точку останова и проверьте, в какой строке вы получаете ошибку

kumari567

код ОКК если у нас есть больше строк в dt1 которых нет в dt2 но проблема возникает когда есть одна и та же строка в обеих таблицах

kumari567

ВАР темп = ДТ.Строк.Метод oftype&ЛТ;строкаданных и GT;().Где(а => по ДТ.Строк.Метод oftype&ЛТ;строкаданных и GT;().
Выберите(k => конвертировать.ToString(k["Station"])). Except(myDataTable.Rows.Метод oftype&ЛТ;строкаданных и GT;().Выберите(к =&ГТ; преобразование.ToString(k["станция"])).Толист()).Содержит(Convert.Метод toString(а [станция""]))).CopyToDataTable().Методом asenumerable();
Я получаю ошибку в приведенном выше коде, когда в dt1 нет дополнительной строки

Karthik_Mahalingam

видите ли, вы получаете эту ошибку из-за [.CopyToDataTable() ]
если значение datarow[] равно null или count равно 0, то вы получите ошибку
поэтому перед вызовом этой функции [.CopyToDataTable ()] проверьте наличие not null и count >0

Member 13041105

что делать, если я хочу проверить все столбцы, если есть mistmatch ? как мне сделать это, пожалуйста, помогите им новые возможности C#

Karthik_Mahalingam

тот же код, добавив все столбцы условия.

kumari567

Спасибо, большое спасибо ......Вы очень хорошо понимаете эту проблему ...и дайте хорошее объяснение ...большое спасибо за ваше время.. большое вам спасибо ...:)

Karthik_Mahalingam

добро пожаловать :)

kumari567

:)

Рейтинг:
1

Amit Kumar Mohanty

public DataTable getDiffRecords(DataTable dtDataOne, DataTable dtDataTwo)
        {
            DataTable returnTable = new DataTable("returnTable");

            using (DataSet ds = new DataSet())
            {
                ds.Tables.AddRange(new DataTable[] { dtDataOne.Copy(), dtDataTwo.Copy() });

                DataColumn[] firstColumns = new DataColumn[ds.Tables[0].Columns.Count];
                for (int i = 0; i < firstColumns.Length; i++)
                {
                    firstColumns[i] = ds.Tables[0].Columns[i];
                }

                DataColumn[] secondColumns = new DataColumn[ds.Tables[1].Columns.Count];
                for (int i = 0; i < secondColumns.Length; i++)
                {
                    secondColumns[i] = ds.Tables[1].Columns[i];
                }

                DataRelation r1 = new DataRelation(string.Empty, firstColumns, secondColumns, false);
                ds.Relations.Add(r1);

                DataRelation r2 = new DataRelation(string.Empty, secondColumns, firstColumns, false);
                ds.Relations.Add(r2);

                for (int i = 0; i < dtDataOne.Columns.Count; i++)
                {
                    returnTable.Columns.Add(dtDataOne.Columns[i].ColumnName, dtDataOne.Columns[i].DataType);
                }

                returnTable.BeginLoadData();
                foreach (DataRow parentrow in ds.Tables[0].Rows)
                {
                    DataRow[] childrows = parentrow.GetChildRows(r1);
                    if (childrows == null || childrows.Length == 0)
                        returnTable.LoadDataRow(parentrow.ItemArray, true);
                }

                foreach (DataRow parentrow in ds.Tables[1].Rows)
                {
                    DataRow[] childrows = parentrow.GetChildRows(r2);
                    if (childrows == null || childrows.Length == 0)
                        returnTable.LoadDataRow(parentrow.ItemArray, true);
                }
                returnTable.EndLoadData();
            }
            return returnTable;
        }


Рейтинг:
0

kumari567

DataSet ds=new DataSet();
          DataSet ds1 = new DataSet();

          ds1.ReadXml(HttpContext.Current.Server.MapPath("XML/myFile.xml"));
          DataTable dt1 = ds1.Tables[0];



    var  query = (from p in dt.AsEnumerable()join t in dt1.AsEnumerable()
                                on p.Field<string>("Station")  equals t.Field<string>("Station")
                            select new
                           {
                               Station = p.Field<string>("Station"),
                               Max_Temp = p.Field<string>("Max_Temp"),
                               Min_Temp = p.Field<string>("Min_Temp"),
                              Weather_Detail = p.Field<string>("Weather_Detail"),
                              DateTime = p.Field<string>("DateTime")

                       });




          DataTable myDataTable = new DataTable();
          myDataTable.Columns.Add("DateTime", typeof(string));
          myDataTable.Columns.Add("Station", typeof(string));
          myDataTable.Columns.Add("Max_Temp", typeof(string));
          myDataTable.Columns.Add("Min_Temp", typeof(string));
          myDataTable.Columns.Add("Weather_Detail", typeof(string));



          foreach (var element in query)
          {
              var row = myDataTable.NewRow();
              row["DateTime"] = element.DateTime;

              row["Station"] = element.Station;
              row["Max_Temp"] = element.Max_Temp;

              row["Min_Temp"] = element.Min_Temp;

              row["Weather_Detail"] = element.Weather_Detail;


             myDataTable.Rows.Add(row);
          }



          DataTable dtExtraRowOfXml = new DataTable();

          if ((dt !=null && dt.Rows.Count > 0) && (myDataTable != null && myDataTable.Rows.Count > 0))
          {
              var temp = dt.Rows.OfType<DataRow>().Where(a => dt.Rows.OfType<DataRow>().
               Select(k => Convert.ToString(k["Station"])).Except(myDataTable.Rows.OfType<DataRow>().Select(k => Convert.ToString(k["Station"])).ToList()).Contains(Convert.ToString(a["Station"]))).CopyToDataTable().AsEnumerable();
              if (temp != null && temp.Count() > 0)
                  dtExtraRowOfXml = temp.CopyToDataTable();

          }

          DataTable dtfinalXml;
          if (dtExtraRowOfXml.Rows.Count > 0)
              dtfinalXml = myDataTable.AsEnumerable().Union(dtExtraRowOfXml.AsEnumerable(), DataRowComparer.Default).CopyToDataTable();

          else
          {
              dtfinalXml = myDataTable.Clone();
          }


          ds.Tables.Add(dtfinalXml);

         // ds.Tables.Add(myDataTable);
          string strXml = ds.GetXml();
          XmlDocument xDoc = new XmlDocument();
          xDoc.LoadXml(strXml);
          xDoc.Save(HttpContext.Current.Server.MapPath("XML/myFile.xml")); //XML is the folder name and myFile.xml is ur new file name