2011-09-22 55 views
2

我知道以下查询是如何工作的,我只是对这个术语感到困惑。这是否也被视为子查询?

每个查询都以强制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; 

但不像在上述例子中的子查询,下面的子查询(from p2 in artist.Albums)不与它自己的SELECT结束/ GROUP子句,所以它的结构不同,它以FROM子句开头,但不以SELECT/GROUP子句结束。所以我的问题是子查询这个术语是否也适用于from p2 in artist.Albums,即使它的结构有点不同?

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

谢谢

回答

1

在您的第二个查询result1中,没有子查询,只是包含两个from子句的查询。

在幕后,用两个from条款以这种方式将被翻译成SelectMany操作:

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

是的,但不是“从P2在p1.Albums”行为类似于子查询对每个外部元素p1来说,它的整个集合(p1.Albums)是枚举的? – user702769

+1

是的,''p1.albums'“与p1.albums select p2'中的p2的子查询表达式相同”,但它是如何组成查询表达式的,这些查询表达式确定您是否拥有包含子查询表达式的查询表达式或一个没有。如果只有一个'select'和'group by'子句,那么它只是一个查询表达式(可能有多个'from'子句)。无论如何,某件事情是否被视为_query_是更主观的,但是当涉及到_query expressions_的语法时,它会更加明确。 –

+0

我很抱歉花时间,我会将它标记为在一两天内回答,无论您是否回答此问题。无论如何,你是什么意思的“...并没有小组条款...”?我会假设如果查询中只有一个SELECT或只有一个GROUP子句,那么查询只有一个查询表达式而没有任何子查询?如果一个查询Q有一个GROUP INTO子句,然后是SELECT,那么Q在概念上被分割成两个查询表达式(换句话说,Q没有带子查询的查询表达式)? – user702769

2

没有,在底部你正在做一个隐式连接,而不是一个子查询。联接是您同时查询两个表的位置(在同一个查询中)。