对应SQL语句:
select * from Person join Telephone on Person.Id = Telephone.PersonId
public List GetTwo()
{
var query = from a in _entityRepository.GetAll()
join b in _TelRepository.GetAll()
on a.Id equals b.PersonId
select new Twotable{
Name=a.Name,
Telephone=b.PhoneNumber
};
return query.ToList();
}
public List GetTwo()
{
var query = _entityRepository.GetAll()
.Join(
_TelRepository.GetAll(),
top => top.Id,
art => art.PersonId,
(top, art) => new Twotable
{
Name = top.Name,
Telephone = art.PhoneNumber
});
return query.ToList();
}
左连接的概念:
对应SQL语句:
select * from Person left join Telephone on Person.Id = Telephone.PersonId
右连接的概念:
对应SQL语句:
select * from Person right join Telephone on Person.Id = Telephone.PersonId
多表查询
左右连接,取决于 a b2个的位置
var leftOuterJoin = from a in _entityRepository.GetAll()
join b in _TelRepository.GetAll()
on a.Id equals b.PersonId
into cls from c in cls.DefaultIfEmpty()
select new Twotable
{
Name = a.Name,
Telephone = c.PhoneNumber
};
var leftOuterJoin = _entityRepository.GetAll()
.GroupJoin(
_TelRepository.GetAll(),
top => top.Id,
art => art.PersonId,
(top, art) => new Twotable
{
Id = top.Id,
Name = top.Name,
Telephone = art.FirstOrDefault(x => x.PersonId == top.Id).PhoneNumber
}).Select(o => o);
全连接的概念
对应SQL语句
select * from Person full outer join Telephone on Person.Id = Telephone.PersonId
使用全连接:(合并左右连接就可以了)
//右连接
var rightOuterJoin = from b in _TelRepository.GetAll()
join a in _entityRepository.GetAll()
on b.PersonId equals a.Id
into cls
from c in cls.DefaultIfEmpty()
select new Twotable
{
Id = c.Id,
Name = c.Name,
Telephone = b.PhoneNumber
};
//左连接
var leftOuterJoin = from a in _entityRepository.GetAll()
join b in _TelRepository.GetAll()
on a.Id equals b.PersonId
into cls from c in cls.DefaultIfEmpty()
select new Twotable
{
Name = a.Name,
Telephone = c.PhoneNumber
};
var fullOuterJoin = leftOuterJoin.Union(rightOuterJoin);
或者
var fullOuterJoin = leftOuterJoin.Concat(rightOuterJoin);
如果想 3表 或 4表 连接,那就和SQL语句一样在下面加 join就好了
var query = from b in _TelRepository.GetAll()
join a in _entityRepository.GetAll()
on b.PersonId equals a.Id
into cls
from c in cls.DefaultIfEmpty()
join d in _userRepository.GetAll()
on c.Id equals d.Id
from e in cls.DefaultIfEmpty()
select new Twotable
{
Id = c.Id,
//Name = c.Name,
Name =e.Name,
Telephone = b.PhoneNumber
};