【问题标题】:How does linq decide between inner & outer joinslinq 如何决定内连接和外连接
【发布时间】:2010-03-27 07:28:51
【问题描述】:

通常 linq 对其查询使用左外连接,但在某些情况下它决定使用内连接。 我有一种情况,该决定会导致错误的结果,因为第二个表并不总是有合适的记录,并且会从第一个表中删除记录。 我在 dbml 上使用 linqdatasource,其中相关表是相同的,但其中一个包含从第一个删除的历史记录。两者都有相同的主键。我正在使用数据加载选项一次加载两个表,而无需往返。

您能解释一下为什么 linq 决定在这里使用内部联接吗?

谢谢

【问题讨论】:

    标签: linq-to-sql


    【解决方案1】:

    不,很遗憾你错了。 LINQ Join 运算符始终执行内部联接。 http://www.hookedonlinq.com/JoinOperator.ashx

    如果要进行左外连接,则需要使用 select 或 foreach 的组合。请参阅以下示例:

    或者谷歌一下,那里有很多例子。

    【讨论】:

    • ps 如果你彻底了解了Select 运算符,你可以不用Join 运算符就可以了。
    【解决方案2】:

    最好的做法是尽可能不要使用连接运算符,而是依靠遍历实体之间数据上下文中设置的关系。

    from r in Rabbits
    select
    {
        r.Name
        r.Parent.Name
    }
    

    这将自动遍历父关系并决定运行适当的sql。

    适当地使用 .DefaultIfEmpty() 将意味着添加任何 NULL 条目,因此将其转换为适当的外连接。这可以通过包含“into”与连接运算符一起使用。

    JOIN and LEFT JOIN equivalent in LINQ

    【讨论】:

    • 我正在这样做,并使用 dataloadoptions 在同一个查询中同时获取 Rabbit 和 Parent。我的问题是 linq 如何决定兔子和父母之间使用的连接类型?
    • 这取决于您选择的内容以及关系中涉及的字段是否可为空。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 2010-09-28
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多