繁体   English   中英

使用EF实现左外部联接

[英]Implement left outer join using EF

我正在尝试在VS2015中使用C#将SQL语句转换为EF

下面是SQL语句:

Select i.cdin_cdindexid,p.pinv_PerformaInvID,coalesce(i.cdin_serial,0) as depno 
                         ,coalesce(convert(datetime,left(convert(nvarchar,i.cdin_startunstufdate,120),10),120),'-') as deidate,coalesce(i.cdin_goodsDesc,'-') as gooddesc ,coalesce(i.cdin_Customdeclar,'-') as custdec 
                         ,coalesce(i.cdin_NoofPackages,0) as pkg,coalesce(i.cdin_WT,0) as wt ,coalesce(i.cdin_volumewt,0) as vwt ,coalesce(i.cdin_MortgageAmount,0) as lcamt,coalesce(p.pinv_name,'-') as invno,coalesce(p.pinv_TotalAmount,0) as invamt,p.pinv_Status,p.pinv_InvoiceProperty as prop 
                         ,coalesce(c.comp_name,'-') as custname,coalesce(Comp_CompanyId,'-') as custid ,coalesce(c.comp_idcust,'-') as accpacno,coalesce(t.Terr_Caption,'-') as Terr,convert(nvarchar,'01',2) as type     
                         from cdindex i inner join   company c on i.cdin_CompanyId =c.Comp_CompanyId  inner join Territories t on i.cdin_Secterr =t.Terr_TerritoryID left outer join PerformaInv p on i.cdin_cdindexid=p.pinv_CDIndexId 
                         where(cdin_deleted Is null And c.comp_deleted Is null And t.Terr_Deleted Is null And p.pinv_deleted Is null)
                         and cdin_startunstufdate between '2016-06-01' and '2016-07-28'
                          and (p.pinv_status in('Draft','Posted') or pinv_status is null) and (p.pinv_InvoiceProperty ='01' or p.pinv_InvoiceProperty is null )

我试图实现联接,但是我陷入了如何在PerformaInv表上然后on i.cdin_cdindexid=p.pinv_CDIndexId上使用into和DefaultIfEmpty()离开外部on i.cdin_cdindexid=p.pinv_CDIndexId

这是我试图做到的:

ar q = (from i in db.CDIndexes
             join c in db.Companies on i.cdin_CompanyId equals c.Comp_CompanyId
             join t in db.Territories on i.cdin_Secterr equals t.Terr_TerritoryID into
              p from pr in p.DefaultIfEmpty

             where (i.cdin_startunstufdate>= new DateTime(2016 - 06 - 01) && i.cdin_startunstufdate>= new DateTime(2016-06-28)

             )



             select new
             {

                 i.cdin_CDIndexID,
                 i.cdin_Serial,
                 i.cdin_startunstufdate,
                 i.cdin_goodsDesc,
                 i.cdin_Customdeclar,
                 i.cdin_NoofPackages,
                 i.cdin_WT,
                 i.cdin_volumewt,
                 i.cdin_MortgageAmount,

             });

我知道有很多东西不见了,但我真的很烂。

正如我在评论中提到的,最好使用导航属性。 但是一旦开始手动联接,将内联接转换为左外联接(虽然不是自然的)就不是那么困难了。

因此,鉴于您的加入

from i in db.CDIndexes
join c in db.Companies on i.cdin_CompanyId equals c.Comp_CompanyId
join t in db.Territories on i.cdin_Secterr equals t.Terr_TerritoryID
join p in db.PerformaInvs on i.cdin_CDIndexID equals p.pinv_CDIndexId
...

您可以使用join子句(C#参考)中显示的模式将其中的任何一个都左外连接-Left Outer Join

from i in db.CDIndexes
join c in db.Companies on i.cdin_CompanyId equals c.Comp_CompanyId
join t in db.Territories on i.cdin_Secterr equals t.Terr_TerritoryID
join p in db.PerformaInvs on i.cdin_CDIndexID equals p.pinv_CDIndexId
// the following line turns the above join to left outer
into p_Join from p in p_Join.DefaultIfEmpty()
...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM