理解Linq'的INTO关键字有些困难

本文关键字:关键字 INTO Linq 理解 | 更新日期: 2023-09-27 18:08:29

1)

into关键字创建用于存储连接结果的临时标识符。分组或选择子句

我假设into关键字只能用作groupjoin或select子句的一部分?

2)

a)我读到,当into被用作选择子句的一部分时,它将查询拼接为两半,并且由于在查询的前半部分声明的范围变量总是在查询的后半部分超出范围。正确吗?

b)但是当into被用作join子句的一部分时,范围变量永远不会超出查询的范围(除非查询还包含group...intoselect...into)。我认为这是由于into在使用join子句时没有将查询拼接成两半?

c)查询表达式由from子句和可选的查询主体(from,where,let子句)组成,并且必须以select of group子句结束。

d)如果into确实将查询拼接成两半,在下面的例子中group子句是正文的一部分:

        var result = from c1 in a1
                     group c1 by c1.name into GroupResult
                     select ...

谢谢


回复张学友:

)

在一个组by之后,你得到一个像这样的序列IEnumerable>

GroupBy操作符不是返回IEnumerable<IGrouping<Key,Foo>>类型的结果而不是IEnumerable<Key,IEnumerable<Foo>>类型的结果吗

b)难道我们不能认为group...by...intojoin...into在某种意义上拼接查询,至少在概念上,查询的前半部分必须在查询的后半部分运行之前运行?

回复Robotsushi:

我越想越觉得我的问题毫无意义,因为它没有任何实际价值。仍然…

当你说它被分割。你是指变量的作用域吗分割或生成的SQL查询被分割

引语如下:

在许多情况下,这条分界线一侧的范围变量不能为与另一边的范围变量混合。into关键字这是group-by子句的一部分,用于连接或拼接这个查询的两部分。因此,它标志着中间的边界范围变量通常无法爬升的查询的。的最后,into关键字上面的范围变量将超出作用域查询的一部分

我的问题是这两部分是否仍然被认为是一个查询,因此整个查询仍然由三个部分组成。如果是这种情况,那么在我的代码示例中(在d下)group子句是主体的一部分。但是如果这两个部分都被认为是两个查询,那么每个查询将由三个部分组成


2。回复Robotsushi:

查询的这个块被评估为一个数据拉取。

我不熟悉术语"数据拉",所以我猜你想说的是查询的前半部分作为一个单元执行/评估,然后查询的后半部分从前半部分获取结果并在其执行/评估中使用结果?换句话说,概念上我们有两个查询?

理解Linq'的INTO关键字有些困难

group…通过…

group by必须在操作后提供不同类型的序列。

你有一个像这样的序列:

IEnumerable<Foo>

在一个group by之后你会得到一个像这样的序列

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

加入…在…在

另一方面,组连接不是这种操作。它们作用于两个序列,而群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.

1)正确…更具体地说,into为连接、组或选择子句的结果提供引用,这些子句将超出作用域。

2)我不认为你的查询被分割为使用into的结果,因为它的使用是最常见的:

在组子句中使用into只有在需要时才有必要对每个组执行额外的查询操作

<

添加响应/strong>

我读到过,当into被用作group或select的一部分时子句,它将查询拼接为两部分,因为这个范围在查询的前半部分声明的变量总是超出作用域在查询的后半部分。正确吗?

查询的这个块被评估为一个数据拉取。group关键字需要一个排序操作来继续LINQ查询的求值:

from c1 in a1
group c1 by c1.name into GroupResult

所以在下面选择:

选择……

查询第一部分的变量应该已经被求值了,但是由于在关键字中包含了,因此可以在选择中使用查询的结果,因为它们存储在GroupResult变量中。

但是当into被用作连接子句的一部分时,rangle变量永远不要超出查询的作用域(除非查询也包含group…into或select…into)。我想这是由于当与连接子句一起使用时,不将查询拼接为两半?

查询仍然分为两部分求值,但是GroupResult允许您访问在group关键字之前声明的内容。

查询表达式由from子句和optional子句组成查询主体(from、where、let子句),必须以select结尾组子句

这是一个定义,不是一个问题。

如果into确实将查询拼接成两半,则在下面正文部分的组子句示例:

组是查询的前半部分的一部分。

如果您好奇的话,所示的LINQ查询将生成一条sql语句。

2日更新

我不熟悉"数据拉取"这个术语,所以我要猜一下你想说的是前半部分的问题作为一个单元执行/求值,然后查询的后半部分执行从前半部分的结果,并使用的结果在其执行/评估?换句话说,概念上我们有两个查询呢?

是的,查询有两个不同的部分。