-
Notifications
You must be signed in to change notification settings - Fork 455
Join query
so edited this page May 22, 2021
·
4 revisions
Chloe 友好支持多表连接查询,一切都可以用 lambda 表达式操作,返回类型可以是自定义类型,也可以是匿名类型。强类型开发,编译可见错误,容错率高。
1. 建立连接:
var person_city_province = dbContext.Query<Person>()
.InnerJoin<City>((person, city) => person.CityId == city.Id)
.InnerJoin<Province>((person, city, province) => city.ProvinceId == province.Id);
2. 得到一个 IJoinQuery 对象,就可以 Select 所需要的数据返回一个 IQuery 对象,然后就可以进行 Where、OrderBy、GroupBy、分页、聚合查询等操作:
查出一个用户及其隶属的城市和省份的所有信息:
/* 调用 Select 方法返回一个泛型为包含 Person、City、Province 匿名类型的 IQuery 对象。
* Select 方法也可以返回自定义类型 。
*/
var view = person_city_province.Select((person, city, province) => new
{
Person = person,
City = city,
Province = province
});
/* 根据条件筛选,然后调用 ToList 就会返回一个泛型为 new { Person = person, City = city, Province = province } 的 List 集合 */
var result = view.Where(a => a.Person.Id == 1).ToList();
/*
* SELECT [Person].[Name] AS [Name],[Person].[Gender] AS [Gender],[Person].[Age] AS [Age],[Person].[CityId] AS [CityId],[Person].[CreateTime] AS [CreateTime],[Person].[EditTime] AS [EditTime],[Person].[Id] AS [Id],[City].[Name] AS [Name0],[City].[ProvinceId] AS [ProvinceId],[City].[Id] AS [Id0],[Province].[Name] AS [Name1],[Province].[Id] AS [Id1]
FROM [Person] AS [Person] INNER JOIN [City] AS [City] ON [Person].[CityId] = [City].[Id] INNER JOIN [Province] AS [Province] ON [City].[ProvinceId] = [Province].[Id]
WHERE [Person].[Id] = 1
*/
/* 如果不想返回所有字段,得到 IQuery 对象后可以进一步 Select 指定的字段提高查询性能
* ##推荐使用此方式##
*/
var result1 = view.Where(a => a.Person.Id == 1)
.Select(a => new { PersonId = a.Person.Id, PersonName = a.Person.Name, CityName = a.City.Name, ProvinceName = a.Province.Name })
.ToList();
可以只获取指定的字段信息:
person_city_province.Select((person, city, province) => new
{
PersonId = person.Id,
PersonName = person.Name,
CityName = city.Name,
ProvinceName = province.Name
}).Where(a => a.PersonId == 1).ToList();
/*
* 生成的 sql 只会包含 PersonId、PersonName、CityName、ProvinceName 四个字段
* SELECT [Person].[Id] AS [PersonId],[Person].[Name] AS [PersonName],[City].[Name] AS [CityName],[Province].[Name] AS [ProvinceName]
FROM [Person] AS [Person] INNER JOIN [City] AS [City] ON [Person].[CityId] = [City].[Id] INNER JOIN [Province] AS [Province] ON [City].[ProvinceId] = [Province].[Id]
WHERE [Person].[Id] = 1
*/
快捷连接
框架提供了快捷连接的接口:
dbContext.JoinQuery<Person, City, Province>((person, city, province) => new object[]
{
JoinType.LeftJoin, person.CityId == city.Id, /* 表 Person 和 City 进行Left连接 */
JoinType.LeftJoin, city.ProvinceId == province.Id /* 表 City 和 Province 进行Left连接,注:顺序不能搞反 */
})
.Select((person, city, province) => new { Person = person, City = city, Province = province }) /* 投影成匿名对象 */
.Where(a => a.Person.Id > -1) /* 进行条件过滤 */
.OrderByDesc(a => a.Person.Age) /* 排序 */
.TakePage(1, 20) /* 分页 */
.ToList();
超过5个表连接
//假设已经有5个表建立了连接的对象为 jq_q1_q5
IJoinQuery<T1, T2, T3, T4, T5> jq_q1_q5 = null;
//jq_q1_q5 调用 Select 方法,返回一个包含 T1-T5 的 IQuery<T> 对象 view_q1_q5
var view_q1_q5 = jq_q1_q5.Select((t1, t2, t3, t4, t5) => new { T1 = t1, T2 = t2, T3 = t3, T4 = t4, T5 = t5 });
//假设第6个表的 IQuery<T6> 对象为 q6
IQuery<T6> q6 = null;
//这时,view_q1_q5 与 q6 建立连接,返回 IJoiningQuery 对象 jq
var jq = view_q1_q5.InnerJoin(q6, (t1_t5, t6) => t1_t5.T5.XX == t6.XXX);
//然后我们调用 jq 的 Select 方法,返回一个包含 T1-T6 的 IQuery<T> 对象 view。
//view 又是一个 IQuery<T> 对象,泛型参数为包含 T1-T6 所有信息的匿名对象(这时候还没有发起 sql 查询哦),拿到它,我们就可以为所欲为了。
var view = jq.Select((t1_t5, t6) => new { T1 = t1_t5.T1, T2 = t1_t5.T2, T3 = t1_t5.T3, T4 = t1_t5.T4, T5 = t1_t5.T5, T6 = t6 });
//可以直接查出数据库中 T1-T6 的所有信息
view.ToList();
//也可以选取 T1-T6 中我们想要的字段
view.Select(a => new { a.T1.xx, a.T2.xx, a.T3.xx /*...*/}).ToList();
框架亦支持左连接、右连接和 Full 连接查询,用法和内连接相同。
熬夜的时候容易引起脱发,熬夜时人的免疫力会下降,还会引起内分泌的变化,导致皮脂分泌增多,这些因素都不利于头发的生长,有可能引起脱发。如果出现熬夜脱发的情况,需要及时纠正日常的生活习惯,合理安排休息时间,早睡早起,适当的锻炼身体,多进食优质的蛋白质,增强身体的抵抗力,促进头发的生长。
发量有限,远离996!!!