mysql - Linq to Entities 和 LEFT OUTER JOIN 问题与 MANY :1 relations

标签 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,但在这种情况下使用它是否明智?它能解决我的问题吗?

编辑

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

  • Entity Framework V1
  • 为 Mysql 开发 dotConnect
  • MySql 数据库

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

最佳答案

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

关于mysql - Linq to Entities 和 LEFT OUTER JOIN 问题与 MANY :1 relations,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2490919/

相关文章:

mysql - OUTER JOIN 和 FULL OUTER JOIN 最简单的实现?

mysql - XAMPP:MySQL 意外关闭

SQL 魔法 - 查询不应该花费 15 个小时,但确实如此

c# - 使用 Linq 进行多级 where 子句过滤

sql - 不匹配时仍然返回 JOIN 结果

mysql - MySQL 中的 OUTER JOIN 等价物

mysql - 从 CSV 加载数据时遇到错误时,是否有办法跳过行? (错误代码: 1261)

mysql - 将 LEFT JOIN 限制为最多一个结果

c# - Linq to Entities,随机顺序

c# - 如何检查一个 char 数组是否包含另一个 char 数组中的每个元素?