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

Posted

技术标签:

【中文标题】Linq to Entities 和 LEFT OUTER JOIN 问题与 MANY:1 关系【英文标题】:Linq to Entities and LEFT OUTER JOIN issue with MANY:1 relations 【发布时间】:2011-01-30 06:14:55 【问题描述】:

谁能告诉我,为什么 Linq to Entities 将 ma​​ny to 1 关系转换为 left outer join 而不是 inner join?因为数据库本身存在引用约束,确保在正确的表中有记录,所以应该使用inner join 代替(它会工作得更快)

如果关系是多到 0..1 left outer join 将是正确的。

问题

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

编辑

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

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

如果有人可以测试 Microsoft SQL Server 上是否也是如此,如果这是 Devart 的问题还是一般的 L2EF 功能,我也会对此有所了解......但我怀疑 EF 是这里的罪魁祸首。

【问题讨论】:

【参考方案1】:

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

不过,我相信您可以获得内部连接。例如,以下导致提供者构建 LEFT OUTER 联接:

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

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

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" );

【讨论】:

以上是关于Linq to Entities 和 LEFT OUTER JOIN 问题与 MANY:1 关系的主要内容,如果未能解决你的问题,请参考以下文章

在 LINQ to Entities 查询中无法构造实体或复杂类型“Cits.Data.LineImg”。

在 LINQ to Entities 查询中无法构造实体或复杂类型

如何使用 LINQ to Entities 获取字节数组长度?

分组后的LINQ to Entities,COUNT和WHERE不起作用

在 LINQ to Entities 中批量删除

如果存在-UPDATE-else-INSERT 与 Linq-to-Entities?