我正在尝试使用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表上使用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,
});
我知道有很多东西缺失但我真的很糟糕。
答案 0 :(得分:0)
正如我在评论中提到的,最好使用导航属性。但是一旦你开始使用手动连接,将内部连接转换为左外连接(虽然不自然)并不是那么难。
所以给你的联接
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 clause (C# Reference) - 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()
...