使用"from"不止一次相当于加入?

ima*_*mak 6 c# linq

我碰到下面的代码,不知道是什么有这个代码两次的意思.这是否意味着书籍与CSBook之间存在联系?

List<Product> Books = new List<Product>();   
            List<Product> CSBooks = new List<Product>();
            var AllBooks = from Bk in Books
                           from CsBk in CSBooks
                           where Bk != CsBk
                           select new[] { Bk, CsBk };
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 13

它就像一个连接.当你说:

from customer in customers
join order in orders on customer.Id equals order.CustomerId
select whatever
Run Code Online (Sandbox Code Playgroud)

这本质上是一种更有效的写作方式:

from customer in customers
from order in orders
where customer.Id == order.CustomerId
select whatever
Run Code Online (Sandbox Code Playgroud)

你明白为什么吗?第一个说"嘿查询处理器,客户和订单有一个特殊的关系,由客户的ID和订单中存储的客户ID的相等性定义".第二个只是说"给我笛卡尔产品 - 所有可能的客户和订单组合 - 然后过滤掉那些没有任何意义的产品".它们具有相同的效果,但前者效率更高.

但是,您可以使用多个"from"子句来执行比Cartesian产品更有趣的事情.假设一个客户可以有多个地址:

from customer in customers
from address in customer.Addresses
select address
Run Code Online (Sandbox Code Playgroud)

多个from子句实际上是"选择多个". 也就是说,它们采用序列,以及从第一序列的每个项目产生序列的方式,并将所有得到的序列合并在一起.

"选择很多"很简单但非常强大; 我们已经看到你可以使用"选择多个"来进行(缓慢但正确的)连接操作.事实上,如果你足够聪明并且不介意浪费大量的时间和记忆,你可以使用select many来做出每一个可能的查询.例如:

from customer in customers
where customer.City == "London"
select customer
Run Code Online (Sandbox Code Playgroud)

可以写成没有像这样的"where":

from customer in customers
from c in (customer.City == "London" ? 
               new Customer[] {customer} : 
               new Customer[] { } )
select c;
Run Code Online (Sandbox Code Playgroud)

你会疯狂到这样做,但wherejoin实际上是不必要的 -他们只是速度更快,更短,更高效的编写选择多种方式.