Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 外连接linq_C#_Linq - Fatal编程技术网

C# 外连接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

我是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 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”,来自
的第二个
充当来自人员的元素和来自乔布斯的元素之间的交叉连接,第二个查询的情况如何?