Linq 内联接、左外联接、分组联接

微软官方的教程如下:
在自己的项目中应用到了内联接和左外联接,而且是一起应用的;项目需求是这样的,在查询组织机构(B_Organizations)信息时,需要把类别名称和父机构的名称查询出来,这就需要与字典表(B_DataDictionaries)实施内联接、与自己实施左外联接(即便组织机构的ParentID在从表中没有对应记录,或者说与从表的OrganizationsID没有对应,也照样输出,默认是null,需自行处理成空字符串)。
Linq查询如下:
from org in B_Organizations
join dic in B_DataDictionaries on org.TypeID equals dic.DataID
join org2 in B_Organizations on org.ParentID equals org2.OrganizationID into groupOrg2
from o2 in groupOrg2.DefaultIfEmpty()
select new {
    org.OrganizationName,
    org.OrganizationCode,
    dic.DataName,
    ParentOrganizationName = (o2 == null ? "" : o2.OrganizationName)
}

核心表B_Organizations,简称org。在关键字equals左边可以看到整个查询只为两个字段服务:org.TypeID、org.ParentID。
普通的join,其实就是Inner Join,所以在Select从句中,直接 dic.DataName便可以;

而左外联结Left Outer Join是需要 DefaultIfEmpty()方法配合的,所以需要把 org2 的联接集合临时放入 groupOrg2中:

from o2 in groupOrg2.DefaultIfEmpty()

那么在 Select从句中,从 o2 中便可以获取到 OrganizationName。

 

 

posted @ 2012-05-08 17:04  罗霄(Sto)  阅读(614)  评论(0编辑  收藏  举报