我碰到下面的代码,不知道是什么有从这个代码两次的意思.这是否意味着书籍与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)
你会疯狂到这样做,但where和join实际上是不必要的 -他们只是速度更快,更短,更高效的编写选择多种方式.