C# 用不匹配的数据连接C中的两个数据表
我在SQL中有两个表,我将它们填充到C中的DataTables中。它们SQL表位于不同的服务器和不同的数据库中 在第一个表中,我有5列C# 用不匹配的数据连接C中的两个数据表,c#,.net,sql,linq,C#,.net,Sql,Linq,我在SQL中有两个表,我将它们填充到C中的DataTables中。它们SQL表位于不同的服务器和不同的数据库中 在第一个表中,我有5列 Name(string), AgentStatus(string), TimeInState(double), TaskHandled(double), Region(string) 第二个表有3列 Name(string), CChats(double), AChats(double) 我一直在使用这个链接来合并C中的表 然而,我面临的问题是这一点 表1有
Name(string), AgentStatus(string), TimeInState(double), TaskHandled(double), Region(string)
第二个表有3列
Name(string), CChats(double), AChats(double)
我一直在使用这个链接来合并C中的表
然而,我面临的问题是这一点
表1有59行,每个用户一行
表2有25行,每个拥有聊天帐户的用户有2行
当我在C中合并它们时,我只得到表1中与表2中25行相匹配的匹配项。我需要显示表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());
}
您希望在概念上进行左连接,它是外部连接,而不是内部连接
表a和的左外部联接或简单左联接的结果
B始终包含左表A的所有记录,即使
联接条件在正确的表中找不到任何匹配的记录
B
资料来源:
杰夫·阿特伍德(JeffAtwood)也发布了不同加入的声明
在LINQ中,这样做比SQL更麻烦,类似于:
var LeftJoin = from user in Users
join chat in Chats
on user.Name equals user.Name into JoinedTables
from row in JoinedTables.DefaultIfEmpty()
select new
{
Name,
AgentStatus,
TimeInState,
TaskHandled,
Region,
CChats = chat != null ? chat.CChats : 0
AChats = chat != null ? chat.AChats : 0
};
资料来源:
当然,在名称上加入并不理想-希望您在现实世界中确实有一个ID,或者可以真正保证名称都是唯一的,并且将始终如一地提供,例如,没有尾随空格或大写差异
//编辑、寻址更新的代码示例
试试这个:
var result = from table1 in dt1.AsEnumerable()
join table2 in dt2.AsEnumerable()
on (string)table1["Name"] equals (string)table2["Name"]
into joinedDt
from table2 in joinedDt.DefaultIfEmpty()
select new
{
Name = (string)table1["Name"],
Status = (string)table1["Status"],
Time = (double)table1["Time"],
Calls = (double)table1["Calls"],
Region = (string)table1["Region"],
CChats = (table2 != null ? (double)table2["CChats"] : 0)
};
名称“table2”在当前上下文中不存在,在CChats行中对table2的两个引用都得到了该名称。更新了最后一个from行,并在LINQPad中进行了测试