SQLに2つのテーブルがあり、C#のDataTablesに入力します。これらのSQLテーブルは、さまざまなサーバーとさまざまなDBに格納されています。
最初の表には5つの列があります
Name(string), AgentStatus(string), TimeInState(double), TaskHandled(double), Region(string)
2番目のテーブルには3つの列があります
Name(string), CChats(double), AChats(double)
私はこのリンクを使用してC#のテーブルをマージしています
しかし、私が抱えている問題はこれです。
表1には59行あり、ユーザーごとに1行です。
表2には25行あり、チャットアカウントを持つユーザーごとに2行あります。
それらをC#でマージすると、テーブル2の25行に一致するテーブル1からの一致のみが取得されます。テーブル1のすべての行を表示する必要があり、テーブル2に行がある場合はそのデータを表示し、そうでない場合は0を表示します。
問題がどこにあるかはわかっていますが、上記のリンクのselectステートメントにありますが、C#で修正する方法がわかりません。
これが機能しない私のコードです......リストボックスはデバッグ用の出力を表示するためだけのものです.....
DataTable dt1 = new DataTable();
DataTable dt2 = new DataTable();
dt1.Columns.Add("Name", typeof(string));
dt1.Columns.Add("Status", typeof(string));
dt1.Columns.Add("Time", typeof(double));
dt1.Columns.Add("Calls", typeof(double));
dt1.Columns.Add("Region", typeof(string));
dt2.Columns.Add("Name", typeof(string));
dt2.Columns.Add("CChats", typeof(double));
dt2.Columns.Add("AChats", typeof(double));
foreach(DataRow dr in _agentStates.Rows)
{
DataRow row = dt1.NewRow();
row["Name"] = dr[0].ToString();
row["Status"] = dr[1].ToString();
row["Time"] = Convert.ToDouble(dr[2].ToString());
row["Calls"] = Convert.ToDouble(dr[3].ToString());
row["Region"] = dr[4].ToString();
dt1.Rows.Add(row);
}
foreach(DataRow dr in _chatCount.Rows)
{
DataRow row = dt2.NewRow();
row["Name"] = dr[0].ToString();
row["CChats"] = Convert.ToDouble(dr[1].ToString());
row["AChats"] = Convert.ToDouble(dr[2].ToString());
dt2.Rows.Add(row);
}
var result = from table1 in dt1.AsEnumerable()
join table2 in dt2.AsEnumerable() on (string)table1["Name"] equals (string)table2["Name"]
select new
{
Name = (string)table2["Name"],
Status = (string)table1["Status"],
Time = (double)table1["Time"],
Calls = (double)table1["Calls"],
Region = (string)table1["Region"],
CChats = (double)table2["CChats"]
};
foreach (var item in result)
{
listBox1.Items.Add(item.Name + " " + item.CChats.ToString());
}