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

Linq 实体框架/IQueryable中的交叉连接语法,linq,entity-framework,linq-to-entities,iqueryable,linq-expressions,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; 据称,尽管我觉得链接中的语法不对。然后我找到了一个标题为“”的E

我正在努力深化关于IQueryable定制提供者和表达式树的教育。我对自定义分析交叉连接(即SelectMany)感兴趣,我试图了解EF在处理此问题时是否正是这么做的:

var infoQuery =
    from cust in db.Customers
    from ord in cust.Orders
    where cust.City == "London"
    select ord;
据称,尽管我觉得链接中的语法不对。然后我找到了一个标题为“”的EF链接。语法看起来“正确”,但文章本身的表述似乎是正常的内部连接,而不是交叉连接

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

EF和这个所谓的“交叉连接”样本的真实情况是什么

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

  • 一个Console.WriteLine()会自动触发,它会打印“这是一个交叉连接:
    Customer
    Order
  • =
    操作符在查询被完全解释之前(可能是不确定的原因)被神奇地转换为
    !=

  • 如果有人知道一些文章或代码片段可以加速我的教育目标,请分享!:)

    仔细查看语法:

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

    首先,感谢您澄清该链接仅使用内部连接,尽管标题很奇怪。不过,我认为两个连续的
    from
    子句会导致在封面下生成一个
    SelectMany
    ,这通常会导致交叉连接,但EF钩子会将其转换为内部连接。其次,从…db.xxx引入两个
    子句对我来说并不合适。我收到一条消息说只允许使用一个IQueryable(第一个)。所以我仍然对EF和交叉连接有点不确定。是的,第一个构造做了一个
    SelectMany
    ,但它是
    listA的形式。SelectMany(a=>a.Bs)
    选择了a拥有的所有B。交叉连接是
    listA。SelectMany(a=>listB)
    做了a*B。关于一个IQueryable的消息让我感到困惑。我只注意到这是Linqpad的一个人工制品。它还可能取决于查询提供程序。