有人能告诉我,为什么 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/