左外连接的元素是否应该包含table1的列和table2的列?

时间:2017-11-01 02:36:17

标签: c# .net visual-studio linq

在下面的代码中,我想知道为什么由我的左外连接产生的元素(如在from.defaultIfEmpty(emptyOrder)中的d中,其中d是从co.DefaultIfEmpty(emptyOrder)返回的表的元素)不包含来自客户和订单的属性,而只包含来自订单的属性。 我发现自己使用两个变量来显示所需的信息c.c和c.d,以便能够从客户和订单访问信息。如果我用c.d.CompanyName替换c.c.CompanyName,编译器说CompanyName不是c.d的属性,它是一个Order。我不明白的是:加入客户和订单时,不应该是结果表的一个元素吗?那么为什么不包含来自客户和订单的属性,如在SQL中,结果连接表将显示来自Customers和Orders的列全部放入一个表中?

var query11 = from c in CustomerList
                      where c.Country == "USA"
                      join o in OrderList 
                          on c.CustomerID equals o.CustomerID into co
                      from d in co.DefaultIfEmpty(emptyOrder)
                      select new { c, d };

foreach (var c in query11) {
                sbResult.Append(String.Format("CustID = {0}, Name = {1}, 
                OrderID = {2}, OrderDate = {3:d}\r\n",
                   c.c.CustomerID, c.c.CompanyName, c.d.OrderID, 
                   c.d.OrderDate));
}

1 个答案:

答案 0 :(得分:0)

你所看到的是正常的。整个LINQ的质量都有左外连接。如果将鼠标悬停在co上,则其类型为IEnumerable<Order>(或OrderList中的项目类名称)。

&#34;加入的东西&#34;两者的属性是你在最后选择的匿名类型 - all examples LINQ left outer join technique返回一个带有&#34;左表&#34;的匿名类型。对象和&#34;右表&#34;对象 - 或者从每个对象中拉出各种属性。与在SQL中一样,结果集中的字段由您选择的内容决定。

您可以将select new { c, d }更改为select new { c.CustomerID, c.CompanyName, d.OrderID, d.OrderDate }并为您的循环获取更清晰的匿名类型。