将SQL请求转换为linq查询c#(左外部联接和内部联接)

将SQL请求转换为linq查询c#(左外部联接和内部联接),c#,sql,linq,request,C#,Sql,Linq,Request,我是一名新的开发人员,我习惯于进行linq c#查询。我必须将一个sql查询转换为linq,并且我有一个左外部联接和右后面的内部联接的问题。这是下面的问题,你能帮我吗 select ETAB_NOM, ETAB_CODE, count(etab_nom) as nbFiches from tbl_offreSec OS left outer join tbl_ecoleSec ES on ES.code = OS.FK_ecole inner join etablissement on et

我是一名新的开发人员,我习惯于进行linq c#查询。我必须将一个sql查询转换为linq,并且我有一个左外部联接和右后面的内部联接的问题。这是下面的问题,你能帮我吗

select ETAB_NOM, ETAB_CODE, count(etab_nom) as nbFiches from tbl_offreSec OS 
left outer join tbl_ecoleSec ES on ES.code = OS.FK_ecole 
inner join etablissement on etab_code = ES.FK_etablissement 
where OS.archive = 0 and OS.descriptionOrtho = 0 and len(OS.description) > 1 
group by etab_nom, etab_code
order by ETAB_NOM
我的班级(浓缩):

公共类待研究
{
公共int id{get;set;}
公共整数FK_ecole{get;set;}
公共字符串说明{get;set;}
公共可空描述符或{get;set;}
公共int存档{get;set;}
}
公共类tbl_ecoleSec
{
公共int id{get;set;}
公共整数代码{get;set;}
公共int FK_etablisement{get;set;}
}
公共部分类
{
公共int ETAB_ID{get;set;}
公共int ETAB_代码{get;set;}
公共字符串ETAB_NOM{get;set;}
}
更新

关于Svyatoslav的答复:

   IQueryable<ValidOrthoSecList> query = (from OS in db.tbl_offreSec
                                                   join ES in db.tbl_ecoleSec on OS.FK_ecole equals ES.code into gj
                                                   from ES in gj.DefaultIfEmpty()
                                                   join ET in db.ETABLISSEMENTs on ES.FK_etablissement equals ET.ETAB_CODE
                                                   where OS.archive == 0 && OS.descriptionOrtho == 0 && OS.description.Length > 1
                                                   group ET by new { ET.ETAB_NOM, ET.ETAB_CODE } into g
                                                   select new ValidOrthoSecList
                                                   {
                                                       ETAB_NOM = g.Key.ETAB_NOM,
                                                       ETAB_CODE = g.Key.ETAB_CODE,
                                                       nbFiche = g.Sum(x => x.ETAB_NOM == null ? 0 : 1)
                                                   }).OrderBy(e => e.ETAB_NOM);
IQueryable查询=(来自db.tbl\u offreSec中的操作系统
将ES加入OS.FK_ecole上的db.tbl_ecoleSec等于ES.code进入gj
来自gj.DefaultIfEmpty()中的ES
在ES.FK_etablisement等于ET.ETAB_代码的db.etablisements中加入ET
其中OS.archive==0&&OS.descriptionOrtho==0&&OS.description.Length>1
通过新的{ET.ETAB_NOM,ET.ETAB_CODE}将ET分组到g中
选择新ValidOrthoSecList
{
ETAB_-NOM=g.Key.ETAB_-NOM,
ETAB_代码=g.Key.ETAB_代码,
nbFiche=g.Sum(x=>x.ETAB_NOM==null?0:1)
}).OrderBy(e=>e.ETAB__________;n);

所以这里有你的疑问:

var查询=
来自ctx.tbl_offreSec中的操作系统
将es加入os.FK上的ctx.tbl_offreSec等于es.code进入gj
来自gj.DefaultIfEmpty()中的es
将et加入es.FK_上的ctx.etablisement等于et.ETAB_代码
其中os.archive==0&&os.descriptionOrtho==0且os.description.Length>1
通过新的{et.ETAB_NOM,et.ETAB_CODE}将et分组到g中
选择新的
{
g、 Key.ETAB_(名称),
g、 Key.ETAB_代码,
nbFiches=g.Sum(x=>x.ETAB_NOM==null?0:1)
}
var query=query.OrderBy(e=>e.ETAB\u NOM);

也考虑不要使用左连接,因为下面的内部连接将过滤掉空记录。

也许我可以帮助您。发布表示表的类。写LINQ查询会更容易。@SvyatoslavDanyliv DoneI必须用大写字母写,但它可以工作。我已经更新了适合我的代码的版本。非常感谢。
   IQueryable<ValidOrthoSecList> query = (from OS in db.tbl_offreSec
                                                   join ES in db.tbl_ecoleSec on OS.FK_ecole equals ES.code into gj
                                                   from ES in gj.DefaultIfEmpty()
                                                   join ET in db.ETABLISSEMENTs on ES.FK_etablissement equals ET.ETAB_CODE
                                                   where OS.archive == 0 && OS.descriptionOrtho == 0 && OS.description.Length > 1
                                                   group ET by new { ET.ETAB_NOM, ET.ETAB_CODE } into g
                                                   select new ValidOrthoSecList
                                                   {
                                                       ETAB_NOM = g.Key.ETAB_NOM,
                                                       ETAB_CODE = g.Key.ETAB_CODE,
                                                       nbFiche = g.Sum(x => x.ETAB_NOM == null ? 0 : 1)
                                                   }).OrderBy(e => e.ETAB_NOM);