实体框架/ IQueryable中的交叉连接语法

时间:2013-04-24 20:10:45

标签: linq entity-framework linq-to-entities iqueryable linq-expressions

我正在努力加深对IQueryable自定义提供程序和表达式树的教育。我对自定义解析交叉连接(即SelectMany)感兴趣,并且我试图理解这是否正是EF在处理此事时所做的事情:

var infoQuery =
    from cust in db.Customers
    from ord in cust.Orders
    where cust.City == "London"
    select ord;

据称EF can handle cross joins,虽然该链接中的语法对我来说不合适。然后我找到了标题为" Cross Product Queries"的链接。对于EF。语法看起来"正确,"但文章本身就说这些是正常的内连接而不是交叉连接。

实际上,上面的代码片段来自上一篇文章 - 让我想知道EF是否只是说"我知道这两个实体是如何相关的,所以我将自动形成内连接。"

EF的真实故事和所谓的#34;交叉加入"样?

脚注

当我尝试构建自己的IQueryable LINQ提供程序时,我为自己设置的教育目标是为上面的代码片段创建自己的查询上下文,以便在ToList( )在查询上调用:

  1. 自动触发Console.WriteLine(),打印"这是:CustomerOrder
  2. 的交叉联接
  3. 在完全解释查询之前,==运算符会神奇地转换为!=(可能是ExpressionVisitor,但不确定)。
  4. 如果有人知道文章或有代码片段可以加快我的教育目标,请分享! :)

1 个答案:

答案 0 :(得分:2)

仔细查看语法:

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语法不支持它。