1)
我假设into
关键字只能用作group,join或select子句的一部分?
2)
a)我已经读过,当into
用作group或select子句的一部分时,它将查询分为两半,并且由于在查询的上半部分声明的范围变量总是超出了下半部分的范围查询。正确的?
b)但是,当into
用作join子句的一部分时,rangle变量绝不会超出查询范围(除非查询还包含group...into
或select...into
)。我认为这是由于into
在与join子句一起使用时没有将查询分为两半吗?
C)
查询表达式由from子句和可选查询主体(from,where,let子句)组成,并且必须以选择group子句结尾。
d)如果into
确实将查询分为两半,则在下面的示例group子句的正文部分中:
var result = from c1 in a1
group c1 by c1.name into GroupResult
select ...
谢谢你
回复Ufuk:
一种)
GroupBy
运算符是否不返回IEnumerable<IGrouping<Key,Foo>>
类型而不是IEnumerable<Key,IEnumerable<Foo>>
类型的结果b)我们难道不能说
group...by...into
或join...into
确实在某种意义上将查询的前半部分至少在概念上必须在查询的后半部分可以运行之前运行吗?回复Robotsushi:
我思考的越多,我就越觉得我的问题毫无意义,因为它从来没有任何实际值(value)。仍然...
这是报价:
我的问题是两个半部是否仍被视为单个查询,因此整个查询仍仅由三个部分组成。如果是这样,那么在我的代码示例中(在d下))group子句是主体的一部分。但是,如果将这两个部分都视为两个查询,那么这两个查询中的每一个都将由三部分组成
2.回复Robotsushi:
我对“数据提取”一词不熟悉,因此我想猜测一下您想说的是查询的前半部分作为一个单元执行/求值,然后查询的后半部分采用上半年的结果,并在执行/评估中使用结果?换句话说,从概念上讲,我们有两个查询?
最佳答案
group ...作者:... to group by
必须在操作后提供不同种类的序列。
您有一个像这样的序列:
IEnumerable<Foo>
经过一个小组,你会得到这样的序列
IEnumerable<Key,IEnumerable<Foo>>
现在,您的商品按嵌套顺序排列,您无权直接访问它们。这就是为什么第一部分中的标识符超出范围的原因。由于您的第一部分不在范围内,因此在之后留给标识符。它已经结束,可以开始新的查询。查询的第二部分与第一部分的工作顺序完全不同。这是一个延续。
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
加入... on ...进入
另一方面,组联接不是那种操作,它们按两个序列进行操作,而group by则按一个进行操作。它们将在左侧序列的右侧序列上提供匹配元素。
IEnumerable<Left> and IEnumerable<Right>
操作后,它使您可以使用左侧序列中的标识符,但右侧的标识符不在范围内。这是因为join现在返回它们的序列。同样,您也没有直接访问它们的权限。小组加入的结果如下:
IEnumerable<Left,IEnumerable<Right>>
使用组联接时,只有正确的范围变量超出范围。尽管左侧部分仍然保留,但您仍在按相同的顺序进行操作。您尚未提供投影,因此无法继续进行第二次查询。
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.
关于c# - 难以理解Linq的INTO关键字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7380182/