0

My Datatable 1 (dtOutput) 形式(termid,faultid,faultdesc,faulttime,devicetype)

私のデータテーブル 2 (dtOpenEvent) 形式(termid,faultid)

Datatable 2 には存在するが Datatable 1 には存在しない値を取得したい... 2 つの列に基づいて(termid,faultid)、テーブルに主キーがありません。

私はネットで検索し、2つのデータテーブル間の差分を返すコードを見つけました...

どうすれば列の値を取得できますか? 別のデータ テーブルまたは文字列変数のいずれか

コード:-

DataTable dtOpenEvent;
dtOpenEvent = Generix.getOpenEvents(ref Connection);
DataTable dtOutput;
dtOutput = Generix.getFeedData(ref Connection);
var matched = from table1 in dtOpenEvent.AsEnumerable()
              join table2 in dtOutput.AsEnumerable() on table1.Field<string>("ATM") equals table2.Field<string>("termid")
              where table1.Field<int>("Event") == table2.Field<int>("faultid") 
              select table1;
var missing = from table1 in dtOpenEvent.AsEnumerable()
              where !matched.Contains(table1)
              select table1;
4

2 に答える 2

2

dt1 のすべての列を削除してから、例外を実行できます。

このような:
var diff =dt2.AsEnumerable().Except(dt1.AsEnumerable(), DataRowComparer.Default);

完全な例:

            DataTable dt1 = new DataTable();
            DataTable dt2 = new DataTable();

            dt1.Columns.Add("termid", typeof(Int32));
            dt1.Columns.Add("faultid", typeof(Int32));
            dt1.Columns.Add("faultdesc");
            dt2.Columns.Add("termid", typeof(Int32));
            dt2.Columns.Add("faultid", typeof(Int32));

            dt1.Rows.Add(1,2,"desc");
            dt1.Rows.Add(3, 4, "desc");
            dt1.Rows.Add(5, 6, "desc");
            dt2.Rows.Add(1, 2);
            dt2.Rows.Add(3, 4);
            dt2.Rows.Add(7, 8);

            dt1.Columns.Remove("faultdesc");
            var diff =dt2.AsEnumerable().Except(dt1.AsEnumerable(), DataRowComparer.Default);

            foreach (var row in diff)
            {
                Console.WriteLine(row["termid"] + " " + row["faultid"]); //prints 7 8
            }  

または、列を削除する代わりに、次のように linq または dataview を使用して列を選択できます。

        var view = new DataView(dt1);
        DataTable dt3 = view.ToTable(true, "termid", "faultid");    

変更例:

            DataTable dt1 = new DataTable();
            DataTable dt2 = new DataTable();

            dt1.Columns.Add("termid", typeof(Int32));
            dt1.Columns.Add("faultid", typeof(Int32));
            dt1.Columns.Add("faultdesc");
            dt2.Columns.Add("termid", typeof(Int32));
            dt2.Columns.Add("faultid", typeof(Int32));

            dt1.Rows.Add(1,2,"desc");
            dt1.Rows.Add(3, 4, "desc");
            dt1.Rows.Add(5, 6, "desc");
            dt2.Rows.Add(1, 2);
            dt2.Rows.Add(3, 4);
            dt2.Rows.Add(7, 8);

            var view = new DataView(dt1);
            DataTable dt3 = view.ToTable(true, "termid", "faultid");
            var diff =dt2.AsEnumerable().Except(dt3.AsEnumerable(), DataRowComparer.Default);

            foreach (var row in diff)
            {
                Console.WriteLine(row["termid"] + " " + row["faultid"]);
            }
于 2012-11-13T17:47:38.223 に答える
1
As you said : I want to retrieve those values which are present in Datatable 2
but not in Datatable 1...based on two columns `(termid,faultid)`

質問のコンテキストに応じた翻訳: と の 2 つのテーブルがdtOutputありdtOpenEventます。dtOutputの任意の行の最初の 2 つのセルと同じ値を持つ 3 番目のテーブルの行がないように、3 番目のテーブルの の値を取得しますdtOpenEvent。では、こちらです

DataTable dt3 = new DataTable();
dt3.Columns.Add("termid");
dt3.Columns.Add("faultid");
int nr = 0;
for (int i = 0; i < dtOutput.Rows.Count; i++)
{
    bool found = false;
    for (int j = 0; j < dtOpenEvent.Rows.Count; j++)
    {
        if (dtOutput.Rows[i][0] == dtOpenEvent.Rows[j][0] 
            && dtOutput.Rows[i][1] == dtOpenEvent.Rows[j][1])
        {
            found = true;
            break;
        }
    }
    if (!found)
    {
        dt3.Rows.Add(dt3.NewRow());
        dt3.Rows[nr][0] = dtOutput.Rows[i][0];
        dt3.Rows[nr][1] = dtOutput.Rows[i][1];
        nr++;
    }
}
于 2012-11-13T17:50:36.420 に答える