本文介绍一下ABP中的多表查询。
1.创建实体
多表查询,在ABP或者EF中都很简单,这里我们创建一个Demo,一个学生实体、一个学校实体。
学校里面可以有很多学生,学生有一个学校。
实体如下:
学校
public class School:Entity<long> { public string Name { get; set; } public string Address { get; set; } /// <summary> /// 学校里面的学生们 /// </summary> public List<Student> Students { get; set; } }
学生
public class Student: Entity<long> { public string Name { get; set; }
/// <summary> /// 学生所在的学校 /// </summary> public School School { get; set; } }
2.创建数据
现在我们来创建一下Student与School的数据。
School的数据如下:
Student的数据如下:
可以看到,Student名字为alun1、alun2、alun3的对应School1、2、1。
3.查询实体
下面,我们在应用层AppService下面用Repository来查询结果如何。
//用GetAllIncluding方法来查询所有学生的信息,结果包含School实体 var listStudent1 = _studentRepository.GetAllIncluding(s=>s.School).ToList(); //用GetAll方法来查询所有学生的信息,结果包含School实体 var listStudent2 = _studentRepository.GetAll().ToList(); //用GetAll方法来查询所有学校的信息,结果包含List Students实体 var listSchool1 = _schoolRepository.GetAll().ToList(); //用GetAllIncluding方法来查询所有学校的信息,结果包含List Students实体 var listSchool2 = _schoolRepository.GetAllIncluding(s=>s.Students).ToList();
可以看到,结果都包含Student包含School的实体,而且School包含集合是Students。
值得注意的是,这里的GetAllIncluding与GetAll的区别是,GetAllIncluding是明确的指明我要查询的实体里面包含的其他表的实体也要查询出来。
例如,GetAllIncluding(s=>s.School),告诉EF,查询Student的时候,请把它关联的School也查询出来。
如果有多个实体关联,请用逗号“,”隔开。例如 GetAllIncluding(s=>s.School, s=>s.Class)
对于ABP,如果是多租户,用户等多租户的信息查询不到的情况下,在查询前请加下面一句话
CurrentUnitOfWork.DisableFilter(AbpDataFilters.MayHaveTenant, AbpDataFilters.MustHaveTenant);
因为在做多租户的查询是,ABP默认会加一些Filter,只能查询当前登录用户的信息,其他用户的信息Filter掉。
所以上面的意思是去掉多租户查询时的Filter
可以关注本人的公众号,多年经验的原创文章共享给大家。