我正在努力加深我对IQueryable自定义提供者和表达式树的了解。我对自定义解析交叉连接(即SelectMany)感兴趣,我试图理解这是否正是EF在处理这个时所做的:
var infoQuery =
from cust in db.Customers
from ord in cust.Orders
where cust.City == "London"
select ord;
据称EF可以处理交叉连接,尽管该链接中的语法对我来说并不正确。然后我发现了一个链接,标题是"跨产品查询"。EF。语法看起来"正确",";但是这篇文章本身说的好像这些是正常的内连接而不是交叉连接。
确实,上面的代码片段来自上一篇文章—这让我想知道EF是否只是说"我知道这两个实体是如何相关的,所以我将自动形成内部连接"。
EF和所谓的"交叉加盟"到底是怎么回事?样品吗?
脚注
当我尝试构建自己的IQueryable LINQ提供程序时,我为自己设置的教育目标是为上面的代码片段创建自己的查询上下文,这样当在查询上调用ToList()时:
- 自动触发Console.WriteLine()并打印"这是:
Customer
和Order
的交叉连接 - 在查询完全解释之前,
==
操作符被神奇地转换为!=
(可能由ExpressionVisitor,不确定)。
如果有人知道的文章或代码片段,将加快我的教育目标,请分享!:)
仔细查看语法:
from cust in db.Customers
from ord in cust.Orders // cust.
select ...
因为 cust.Orders
这是一个普通的内连接。它甚至是执行连接的首选方式,因为它比常规的连接语句简洁得多。
我不明白这篇"跨产品查询"文章的标题。首先,因为据我所知,"叉乘"适用于三维向量,而不是关系代数。其次,因为示例中没有单个交叉连接,只有内连接。也许他们想说的是上面的语法看起来像一个交叉连接?但事实并非如此,所以在标题中如此显眼地使用这个词只会让人感到困惑。
这个代码片段
from cust in db.Customers
from ord in db.Orders // db.
select ...
是一个真正的交叉连接(或笛卡尔积)。如果有n
客户和m
订单,则结果集包含n * m行。对于订单和客户几乎没有用处,但是对于在两个序列中获得元素的所有组合可能很有用。如果您想要连接,但又需要在连接中添加第二个条件(如
from cust in db.Customers
from ord in db.Orders
where cust.CustomerId == ord.CustomerId && ord.OrderDate > DateTime.Today
有效地将其转换为内连接。也许不是最好的例子,但在某些情况下,这会派上用场。join - on - equals
语法不支持