linq查询中嵌套子查询
为了实现某个模块的功能时,需要查询数据时而这些数据又没有在同一张表里面,为了方便调用数据,就会创建实体类来封装这些数据,由于数据是关联多张表的那么实体类里面就会有多个列表对象,就比如在项目权限管理的权限维护中,查询权限及其权限明细,就需要用到三张表,实际是要查询模块,但是需要的数据还有操作类型,所以就需要根据模块明细里面的外键操作类型ID作为条件去查询操作类型。
这就要创建下面这些实体去封装这些表对象了:
第一个列表对象:ModularAndDetailVo继承了SYS_Modular模块表,还包含了一个列表对象ModularDetailVo 这样就在列表对象里面又嵌套了一个列表对象,只有需要是可以嵌套更多的对象列表的。
public class ModularAndDetailVo:SYS_Modular
{
public List ModularDetails { get; set; }
}
SYS_Modular模块明细表里面有模块ID和模块名称两个字段。
public partial class SYS_Modular
{
public int ModularID { get; set; }
public string ModularName { get; set; }
}
第二个列表对象:ModularDetailVo继承了SYS_ModularDetail模块明细表,还包含了操作类型这一字段。
public class ModularDetailVo:SYS_ModularDetail
{
public string OpType { get; set; }
}
SYS_ModularDetail模块明细又有模块明细ID、操作类型ID和模块ID,这三个字段。
public partial class SYS_ModularDetail
{
public int ModularDetailID { get; set; }
public Nullable OpTypeID { get; set; }
public Nullable ModularID { get; set; }
}
所以在查询权限及权限明细的时候,就需要在linq查询中嵌套子查询,用ModularAndDetailVo列表对象接收数据,查询到ModularDetails的时候由于在创建实体ModularAndDetailVo时是里面还包含着一个对象列表的,平常查询列表对象里面的数据是需要写linq查询的,所以就在查询中再嵌套了一个子查询。
下面就是嵌套进去的子查询,自定义的表名tbModularDetail模块明细表通过操作类型ID作为条件去连接操作类型表,在上面的查询中已经把ModularID模块ID查询出来了,所以外部的查询结果作为子查询条件,这样就可以实现嵌套的多表linq查询。