C# 外连接linq
我是Linq的新手,不知道如何反对,我对C# 外连接linq,c#,linq,C#,Linq,我是Linq的新手,不知道如何反对,我对from子句在两种情况下的用法有一个疑问: 1) 执行如下查询那样的交叉连接 var q1 = from person in people from job in jobs select new {person, job} 2) 执行外部联接 var q2 = from person in people join pet in pets on person equals pet.Owner into gj
from
子句在两种情况下的用法有一个疑问:
1) 执行如下查询那样的交叉连接
var q1 = from person in people
from job in jobs
select new {person, job}
2) 执行外部联接
var q2 = from person in people
join pet in pets on person equals pet.Owner into gj
from subpet in gj
select new { OwnerName = person.FirstName, PetName = subpet.Name };
第二个from子句是作为交叉联接还是根据上下文进行计算?因为
q1将产生人员。计数*工作。计数元素
但是q2将只生成人。Count通常用于根据匹配键关联两个序列的元素,因此它通常是内部联接,但它取决于您定义为匹配的内容,例如,以下内容将生成交叉联接:
List<int> A = new List<int> { 1, 2, 3, 4, 5 };
List<int> B = new List<int> { 1, 2, 3, 4, 5 };
var c = (from a in A join b in B on 1 equals 1 select new { a, b }).ToList();
List A=新列表{1,2,3,4,5};
列表B=新列表{1,2,3,4,5};
var c=(从a中的a到b中的b,在1等于1时选择新的{a,b});
根据MS文档,要对左侧外部联接进行第二次查询,应使用DefaultIfEmpty方法,如图所示。from子句的计算方式始终相同:它返回序列中的每个元素,它是预定义的源还是上下文变量
编辑:我将尝试从一开始就解释。首先,你要加入人和宠物的内部(具体地说是团体)。然后从结果集合(实际上是个人宠物集)中选择新的匿名对象,获取人名(来自gj集合元素)和子集合名(用于gj集合元素中的每个宠物)。我认为第二个from不做交叉连接,因为它从gj中选择,并且每个人都已经是gj集合元素的一部分。如果在第二个from子句中调用gj.DefaultIfEmpty()方法,则没有任何宠物的人(在gj set元素中有空宠物集合)将被添加到结果集中。您可以阅读以下文章以更好地理解它:
gj
。但是如果不使用该上下文,就像在第一个查询中一样,它的行为与交叉连接相同
您是说第二个查询提供了意外数量的元素。也许你不应该把重点放在这一点上,而是放在你得到了什么元素,以及这与你期望的有什么不同。我的问题是关于
from
子句(查询中的第二个子句)而不是join
,它对两个查询(q1和q2)的作用是否相同,或者它为第一个查询生成交叉连接,为第二个查询生成外部连接?对于查询“q1”,第二个from
充当来自人员的元素和来自作业的元素之间的交叉连接,第二个查询的情况如何?在我看来,from
子句不充当交叉连接,但select充当交叉连接。来自的只是交叉连接的方法,因为它提供了序列中的元素。在第二个示例中,您生成了与gj的person-pet内部联接,并使用第二个from
从结果集中选择每个元素,不多不少。要执行左外联接,应替换右值(来自gj集合)对于没有宠物的人,使用空值。这是否意味着来自
的充当foreach循环,来自
的第二个充当第一个循环的内部foreach?我已经更新了我的帖子,并试图更详细地解释这一问题。我不能说为什么会是这样,但我认为编译器“知道”该人员在gj中,不会将该部分转换为交叉连接。我不确定这一点,但您可以尝试使用任何可用的.net反编译器反编译您的代码并查看它。我认为,当您查看翻译后的代码时,您会找到答案。对于查询“q1”,来自
的第二个充当来自人员的元素和来自乔布斯的元素之间的交叉连接,第二个查询的情况如何?