1)
into keyword创建临时标识符,用于存储join,group或select子句的结果.
我假设into关键字只能用作group,join或select子句的一部分?
2)
a)我已经读过,当into用作group或select子句的一部分时,它将查询拼接成两半,并且由于在查询的前半部分声明的范围变量ALWAYS超出范围的下半部分查询.正确?
b)但是当when into作为join子句的一部分使用时,rangle变量永远不会超出查询范围(除非查询也包含group...into或select...into).我假设这是因为into在与join子句一起使用时没有将查询拼接成两半?
c)一个查询表达式包括一个从子句随后可选的查询体(从,其中,让条款),并且必须以结束选择的组子句.
d)如果into确实将拼接查询分为两半,则在下面的示例中,group子句是正文的一部分:
var result = from c1 in a1
group c1 by c1.name into GroupResult
select ...
Run Code Online (Sandbox Code Playgroud)
谢谢
回复Ufuk:
一个)
经过一组你得到一个像这个IEnumerable>的序列
没有一个 GroupBy运营商返回类型的结果IEnumerable<IGrouping<Key,Foo>>,而不是IEnumerable<Key,IEnumerable<Foo>>
b)我们不能认为group...by...into或者join...into拼接查询,因为查询的前半部分至少在概念上必须在查询的后半部分运行之前运行?
回复Robotsushi:
我越是想到它,我越觉得我的问题毫无意义,因为它没有任何实际价值.仍然...
当你说它被分裂.你的意思是变量的范围被拆分或生成的sql查询被拆分
这是引用:
在许多情况下,该除法一侧的范围变量不能与另一侧的范围变量混合.作为此分组子句的一部分的into关键字用于链接或拼接此查询的两半.因此,它标记了查询中间的边界,范围变量通常无法攀升.into关键字上方的范围变量超出了此查询的最后部分的范围.
我的问题是两个半部是否仍被视为单个查询,因此整个查询仍然只包含三个部分.如果是这种情况,那么在我的代码示例中(在d)下)group子句是正文的一部分.但如果两半都被认为是两个查询,则两个查询中的每一个都将由三部分组成
2.回复Robotsushi:
查询的这一部分被评估为一个数据拉取.
我不熟悉术语"数据拉",所以我猜你要说的是查询的前半部分作为一个单元执行/计算,然后查询的后半部分采用上半年的结果并将结果用于执行/评估?换句话说,从概念上讲,我们有两个问题?
分组...按...进入
Agroup by必须在操作后提供不同类型的序列。
你有一个这样的序列:
IEnumerable<Foo>
Run Code Online (Sandbox Code Playgroud)
经过一组后,你会得到这样的序列
IEnumerable<Key,IEnumerable<Foo>>
Run Code Online (Sandbox Code Playgroud)
现在您的项目位于嵌套序列中,您无法直接访问它们。这就是第一部分中的标识符超出范围的原因。由于您的第一部分超出了范围,因此您在into后面留下了标识符。它已经结束,可以开始新的查询。查询的第二部分的工作顺序与第一部分完全不同。这是一个延续。
from foo in foolist
group foo by foo.name into grouped
//foo is out of scope, you are working on a different sequence now
//and you have a ready to use range variable for your second query
Run Code Online (Sandbox Code Playgroud)
加入...于...进入
另一方面,group join 不是那种操作。它们对两个序列进行操作,而 group by 对一个序列进行操作。他们将为左侧序列提供右侧序列上的匹配元素。
IEnumerable<Left> and IEnumerable<Right>
Run Code Online (Sandbox Code Playgroud)
操作完成后,您可以使用左侧序列中的标识符,但右侧的标识符超出范围。那是因为 join 现在返回它们的序列。同样,您无法直接访问它们。组加入的结果是这样的:
IEnumerable<Left,IEnumerable<Right>>
Run Code Online (Sandbox Code Playgroud)
当您使用组连接时,只有右侧范围的变量超出范围。虽然左侧部分仍然存在,但您仍在处理相同的序列。您尚未提供投影,因此无法继续第二个查询。
from left in leftList
join right from rightList
on left.Key equals right.Key into joinedRights
// left is still your range variable, you are still enumerating leftList
// you have to provide a projection here but you won't have a ready to use range variable
// that's why it's not a continuation.
Run Code Online (Sandbox Code Playgroud)