1.在EF中,当在dbset使用join关联多表查询时,连接查询的表如果没有建立相应的外键关系时,EF生成的SQL语句是inner join(内联),对于inner join,有所了解的同学都知道,很多时候这并不是我们的本意,实例如下:
using (var context = new DBEntities())
{
var TestList = from p in context.PersonalInformation
join d in context.Departure
on p.ID equals d.UID
select new
{
ID=p.ID,
};
}
2.EF生成了内连接(inner join)查询,当两个表的任一表的数据不匹配时,查询结果就为空!实际上left join(左联接)才是我们想要的,那么怎么样才能生成left join查询呢?其实只要我们如下改造,EF就能为我们生成left join(左联接)查询!
var TestList = from p in context.PersonalInformation
join d in context.Departure
on p.ID equals d.UID into DD
from dc in DD.DefaultIfEmpty()
select new
{
ID = p.ID,
Name=dc.Name
};
}
对比上下两种写法,可以看到在on表的后面我们加上了into xx,还有不要忘记,还需加上from xxx in xx.DefaultIfEmpty(),重要的就是最后的xx.DefaultIfEmpty(),它的作用是当连接的表为空时也会有一条空的数据,达到了left join的效果。