【发布时间】:2016-08-19 17:08:48
【问题描述】:
我正在尝试在 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 )
我试图实现连接,但我被困在如何使用 into 和 DefaultIfEmpty() 对 PerformaInv 表进行左外连接,然后 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,
});
我知道缺少很多东西,但我真的很糟糕。
【问题讨论】:
-
先用内连接,再转成左外连接,就是加一行。此外,如果您在模型中创建导航属性,则根本不需要编写连接。
-
@IvanStoev 这是做什么的:
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 -
@IvanStoev 对不起,Ivan 先生,我该如何导航?就像在这个link 中一样,请你解释一下在不使用连接的情况下实现代码的方法。
-
是的,就像那个链接一样。没有“实体”类很难解释,但想法是,如果你有两个类 A 和 B 以及一对多关系,你输入 A
public ICollection<B> Bs P { get; set; }和 Bpublic A A { get; set; }和然后在查询中,您可以使用a.Bs或b.A,EF 将为您连接 A 和 B 表。 -
@IvanStoev 不幸的是,我不明白你在说什么,嗯,我猜想将 ORM 与普通 SQL 语句一起使用是使用连接或复杂 SQL 语句的最佳解决方案。
标签: c# sql sql-server entity-framework linq