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

Rob*_*nik 7 mysql linq-to-entities outer-join devart dotconnect

有人可以告诉我,为什么Linq to Entities会将多个关系转换为1个关系left outer join而不是inner join?因为对DB本身存在引用约束以确保在右表中有记录,所以inner join应该使用它(并且它将更快地工作)

如果关系很多,那么0..1 left outer join就是正确的.

是否有可能以某种方式编写LINQ,因此它将转换为inner join而不是left outer join.它会大大加快查询执行速度......我以前没有使用过eSQL,但在这种情况下使用它会是明智的吗?它会解决我的问题吗?

编辑

我更新了我的标签,以包含我在后台使用的技术:

  • 实体框架V1
  • Devart dotConnect for Mysql
  • MySql数据库

如果有人可以测试在Microsoft SQL服务器上是否也是如此,如果这是Devart的问题或者它是一般的L2EF功能,它也会给我一些见解......但我怀疑EF是罪魁祸首.

Mar*_*ins 2

我在实体框架提供商方面做了一些工作,并对此进行了研究。我相信供应商本身在这种情况下也没有选择。命令树由实体框架创建,并将其提供给提供者来构建 SQL。这是一个完整的猜测,但在这种情况下它生成 LEFT OUTER join 的原因可能是因为实体框架并不真正知道数据库中存在引用约束。例如,我可以在从数据库创建实体模型后对其进行处理,并添加/更改不反映数据库正在做什么的约束。也许出于这个原因,设计师选择谨慎行事并制作“LEFT OUTER”连接“以防万一”。

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

var res2 = from a in ent.answers
           select new
           { a.Answer1, a.user.UserName };
Run Code Online (Sandbox Code Playgroud)

但是,以下结果会导致 INNER 连接:

res2 = from a in ent.answers
       join u in ent.users
       on a.UserID equals u.PK
       select new { a.Answer1, u.UserName };
Run Code Online (Sandbox Code Playgroud)

此外,以下实体 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" );
Run Code Online (Sandbox Code Playgroud)