[英]Linq query join is not working
嗨,我想在c#中加入兩個表。 加入代碼如下。 問題是當tourid
中的tb_abc
為null值時,則不會在列表中包含tb_abc
中的那一行。
return (from p in context.tb_abc
from o in context.tb_Second
where o.id==p.tourId
where p.driverId == driverId
select new abcBean
{
id=p.id,
name=o.name
}).ToList<abcBean>();
誰能告訴我我做錯了什么
您沒有在該查詢中進行內部聯接。 您正在進行交叉連接,其中您有兩個表,並將每個記錄連接到每個其他記錄。
如果要包含在其中一個約束上返回null的行,則需要左外連接。
return (from p in tb_abc
join o in tb_Second on p.tourId equals o.id into po
where p.driverId == driverId
from subpo in po.DefaultIfEmpty()
select new abcBean
{
id=p.id,
name=(subpo == null ? String.Empty : subpo.Name)
}).ToList();
考慮這兩個sql語句:
第一個交叉連接:
select id, name
from tb_abc o,
tb_Second p
where
o.id = p.tourID
and p.driverID = @driverID
第二個是左外連接:
select id, name
from tb_abc o
LEFT OUTER JOIN tb_Second p on o.id = p.tourID
where
p.driverId = @driverID
第二個將為您提供一組記錄,其中包括o.id的空值。
第一個會給你一些你很少想要的笛卡爾積 。
Linq的DefaultIfEmpty()
如果沒有找到一側的匹配項,則將默認值(null)放入記錄中,因此它的行為類似於左外連接。
你可以使用左外連接
return (from p in context.tb_abc
join o in context.tb_Second on o.id==p.tourId into gt
where p.driverId == driverId
from subsecond in gt.DefaultIfEmpty()
select new abcBean
{
id=p.id,
name=(subsecond == null ? String.Empty : subsecond.Name)
}).ToList<abcBean>();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.