本文介紹一下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
可以關注本人的公眾號,多年經驗的原創文章共享給大家。



