Linq多表查询
- 内连接
- 直接join表
var query2 = from a in Table_a
//连接表b
join b in Table_b on a.BId equals b.Id into Table_b_temps
from bn in Table_b_temps
//连接表c
join c in Table_c on b.Cid equals c.id into Table_c_temps
from cn in Table_c_temps
//条件
where a.id ==12
//从表中拿到所需要的
select new
{
AId=a.Id
BId=bn.Id
CId=cn .Id
};
- 左连接
- 即以左边的表为标准 左边的表数据有则显示,无的情况下则不显示
- 当左表有数据,右表无数据时会展示出来,右表的字段为空
- 当左表无数据时,右表有数据的情况下即不会展示
- 关键字为DefaultIfEmpty() 后面取值的时候就用三元表达式来判断
var leftJoin = from a in Table_a
//连接表b
join b in Table_b on a.BId equals b.Id
from bn in Table_b_temps
//以b表为中心表c
join c in Table_c on bn.Cid equals c.id into Table_c_temps
from cn in Table_c_temps.DefaultIfEmpty()
//条件
where a.id ==12
//从表中拿到所需要的
select new
{
AId=a.Id
BId=bn.Id
CId=cn!=null ?cn.Id:0
};
- 多条件连接
- 即Join条件多个的情况下,不如说现在应用一个新的表,但是条件是要与那2个表相连,这时候条件不是一个了。
- on new { AId = a.Id, BId = b.id } equals new { AId = c.Id, BId = c.id } into Table_c_temps
var list = from a in Table_a
//连接表b
join b in Table_b on a.BId equals b.Id
from bn in Table_b_temps
//连接表c
join c in Table_c
//将条件全放进去 相对应
on new { AId = a.Id, BId = b.id } equals new { AId = c.aId, BId = c.bId } into Table_c_temps
from cn in Table_c_temps.DefaultIfEmpty()
//条件
where a.id ==12
//从表中拿到所需要的
select new
{
AId=a.Id
BId=bn.Id
CId=cn!=null ?cn.Id:0
};
- 分组
- 将重复的数据过滤
var ChildPhotoList = (from l in list
group l by new { l.Id, l.Name,, l.StartDate, l.EndDate, l.Url, l.Img }
into p
select new
{
Id = p.Key.Id,
Url = p.Key.Url,
EndDate = p.Key.EndDate,
StartDate = p.Key.StartDate,
Img = p.Key.Img,
Name = p.Key.Name,
//将未分组的可以弄成一个List集合
Items = p.Select(p => new 定义的类
{
ChildId = p.ChildId,
ChildName = p.ChildName,
}).ToList(),
}).ToList();
- 合并
- 当条件查询的结果需要合并时可以这样
var l1 = (from s in da.linqname
where s.name.Contains(姓名关键字)
select s).ToList();
var l2 = (from s in da.linqname
orderby s.Phone.Contains(手机号关键字)
select s).ToList();
//合并2次的结果
var item= l1.Concat(l2);
foreach (var l in ll)
{
Console.Write(l.names+"\n");
}
合并的话 只要数据类型和顺序是一样的可以组合在一起,但是可能存在相同数据,可以将其进行分组筛选