Linq to Entities和MANY:1关系的LEFT OUTER JOIN问题

7
有人能告诉我,为什么Linq to Entities将多对一关系翻译成左外连接而不是内连接?因为数据库本身有引用约束,确保右表中有记录,所以应该使用内连接(而且速度更快)。
如果关系是多对0..1,那么左外连接就是正确的。
问题:
是否可能以一种方式编写LINQ,使其转换为内连接而不是左外连接?这将大大加快查询执行速度... 我以前没有使用过eSQL,但在这种情况下使用它是否明智?它会解决我的问题吗?
编辑:
我更新了标签,包括我在后台使用的技术:
- Entity Framework V1 - Devart dotConnect for Mysql - MySql数据库
如果有人可以测试是否在Microsoft SQL Server上也是如此,那么这将为我提供一些见解,看看这是Devart的问题还是通用L2EF功能... 但我怀疑EF是罪魁祸首。
1个回答

2
我曾经在一个实体框架提供程序上进行了一些工作,并对此进行了研究。我认为,在这种情况下,提供程序本身没有选择余地。命令树是由实体框架创建并交由提供程序构建SQL语句的。这只是一个猜测,但也许之所以在这种情况下生成LEFT OUTER连接是因为实体框架并不真正知道数据库中存在外键约束。例如,我可以在从数据库创建的实体模型中进行更改和添加约束,而这些约束与数据库无关。也许出于这个原因,设计者选择采取保险措施并“万一”生成LEFT OUTER连接。

尽管如此,我相信您可以获得内连接。例如,以下内容会导致提供程序构建LEFT OUTER连接:

var res2 = from a in ent.answers
           select new
           { a.Answer1, a.user.UserName };

然而,以下内容会导致内连接:
res2 = from a in ent.answers
       join u in ent.users
       on a.UserID equals u.PK
       select new { a.Answer1, u.UserName };

另外,以下实体 SQL 生成了内连接:

ObjectQuery<DbDataRecord> dr = ent.CreateQuery<DbDataRecord>( 
         "SELECT a.answer1, u.username " +
         "FROM answers as a inner join users as u on a.userid = u.pk" );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接