簡體   English   中英

Linq查詢連接不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM