Linq to sql linq如何在内部和外部之间做出决定;外连接

Linq to sql linq如何在内部和外部之间做出决定;外连接,linq-to-sql,Linq To Sql,通常linq在查询时使用左外部联接,但在某些情况下,它决定使用内部联接。 我遇到这样一种情况,即该决定会导致错误的结果,因为第二个表并不总是有合适的记录,这会从第一个表中删除记录。 我在dbml上使用linqdatasource,其中相关的表是相同的,但有一个表保存从第一个表中删除的历史记录。两者都有相同的主键。我使用dataloadoption一次加载两个表,而不需要往返 你能解释为什么linq决定在这里使用内部连接吗 谢谢不,很遗憾你错了。LINQJoin运算符始终执行内部联接 如果要执行左

通常linq在查询时使用左外部联接,但在某些情况下,它决定使用内部联接。 我遇到这样一种情况,即该决定会导致错误的结果,因为第二个表并不总是有合适的记录,这会从第一个表中删除记录。 我在dbml上使用linqdatasource,其中相关的表是相同的,但有一个表保存从第一个表中删除的历史记录。两者都有相同的主键。我使用dataloadoption一次加载两个表,而不需要往返

你能解释为什么linq决定在这里使用内部连接吗


谢谢

不,很遗憾你错了。LINQ
Join
运算符始终执行内部联接

如果要执行左外部联接,则需要使用select或foreach的组合。参见以下示例:


或者google it,有很多例子。

最好的做法是尽可能不使用连接操作符,而是依赖于遍历在实体之间的数据上下文中建立的关系

from r in Rabbits
select
{
    r.Name
    r.Parent.Name
}
这将自动遍历父关系并决定要运行的适当sql

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


ps如果你彻底学习了
选择
操作符,你可以不用
加入
操作符就可以离开。我正在这样做,并使用dataloadoptions在同一个查询中同时获取Rabbit和Parent。我的问题是linq如何决定Rabit和父级之间要使用的联接类型?这取决于您从中选择的内容以及关系中涉及的字段是否可以为空。