Linq 这也被视为子查询吗?

Linq 这也被视为子查询吗?,linq,linq-to-objects,Linq,Linq To Objects,我知道下面的查询是如何工作的,只是对术语感到困惑 每个查询都以强制FROM子句开始,并且必须以SELECT或GROUP子句结束。在这两个子句之间,我们可以放置任意数量的可选FROM…LET…WHERE子句。子查询只是查询中的一个查询,这意味着它也具有相同的结构: var result = from p1 in artists from p3 in (from p2 in p1.albums select new { ID

我知道下面的查询是如何工作的,只是对术语感到困惑

每个查询都以强制FROM子句开始,并且必须以SELECT或GROUP子句结束。在这两个子句之间,我们可以放置任意数量的可选FROM…LET…WHERE子句。子查询只是查询中的一个查询,这意味着它也具有相同的结构:

var result = from p1 in artists
             from p3 in (from p2 in p1.albums
                         select new { ID = p2.id, Title = p2.title }) 
             select p3;
但与上例中的子查询不同,下面的子查询(
来自Artister.Albums中的p2
)并没有以自己的SELECT/GROUP子句结尾,因此它的结构在某种意义上是不同的,即它以from子句开头,而不是以SELECT/GROUP子句结尾。所以我的问题是,子查询这个术语是否也适用于Artister.Albums中p2的
,即使它的结构有点不同

 var result1 = from p1 in artists
               from p2 in p1.Albums
               select new { Artist_id = p1.id, Album_id = p2.id };

谢谢

不,在底部,您正在执行隐式联接,而不是子查询。联接是指同时查询两个表(在同一查询中)。

在第二个查询中,
result1
,没有子查询,只有一个带有两个
from
子句的查询

在幕后,以这种方式使用两个
from
子句将转换为
SelectMany
操作:

artists.SelectMany( p1      => p1.albums
                   ,(p1,p2) => new { Artist_id = p1.id, Album_id = p2.id })

是的,但是“p1.Albums中的from p2”在行为上是否与子查询类似,即对于每个外部元素p1,它的整个集合(p1.Albums)都被枚举?是的,“
p1.Albums
”与子查询表达式“
from p2 in p1.Albums select p2
”相同但是,决定查询表达式是包含子查询表达式还是不包含子查询表达式的是查询表达式的组合方式。如果只有一个
select
和没有
groupby
子句,那么它只是一个查询表达式(可能有多个
from
子句)。无论什么东西被认为是一个查询,都是比较主观的,但是当涉及到查询表达式的语法时,它的定义就更明确了。我真的很抱歉占用您的时间,我会在一两天内将它标记为已回答,不管您是否回答此问题。不管怎样,你所说的“……没有集团条款……”是什么意思?我假设如果查询中只有一个SELECT或GROUP子句,那么查询中只有一个查询表达式而没有任何子查询?!如果一个查询Q有一个GROUP INTO子句,后跟SELECT,那么Q在概念上被分成两个查询表达式(换句话说,Q没有带子查询的查询表达式)?!我的意思是,如果它只有一个
select
子句或一个
groupby
子句(没有任何其他子句),那么它只是一个查询表达式,而不是有两个或多个
select
子句或两个
groupby
子句或其中一个(这将使它成为多个查询表达式).