有人可以告诉我,为什么Linq to Entities将多对1 关系转换为left outer join
而不是inner join
?因为对DB本身存在引用约束以确保在右表中有记录,所以应该使用inner join
代替(并且它将更快地工作)
如果关系是多次到0..1 left outer join
是正确的。
是否可以以某种方式编写LINQ,因此它将转换为inner join
而不是left outer join
。它会大大加快查询执行速度......我以前没有使用过eSQL,但在这种情况下使用它会是明智的吗?它会解决我的问题吗?
我更新了我的代码,以包含我在后台使用的技术:
如果有人可以测试在Microsoft SQL服务器上是否也是如此,如果这是Devart的问题或者它是一般的L2EF功能,它也会给我一些见解...但我怀疑EF是罪魁祸首。
答案 0 :(得分:2)
我已经对实体框架提供商进行了一些工作,并对此进行了研究。我相信提供商本身在这种情况下别无选择。命令树由实体框架创建,并将其提供给提供程序以构建SQL。这是一个完整的猜测,但也许它在这种情况下生成LEFT OUTER连接的原因是因为实体框架并不真正知道数据库中存在引用约束。例如,在从数据库创建实体模型并添加/更改对数据库正在执行的操作没有反映的约束之后,我可以进入并清除实体模型。也许是因为这个原因,设计师们选择安全地玩它并制作LEFT OUTER加入“以防万一”。
尽管如此,我相信你可以得到一个内心的联系。例如,以下内容导致提供程序构建LEFT OUTER join:
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" );