简体   繁体   English

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

[英]Convert SQL Request to linq query c# (left outer join and inner join)

I am a new developer and I am used to doing my linq c # queries.我是一名新开发人员,我习惯于进行 linq c # 查询。 I have to convert an sql query to linq and I have a problem with a left outer join and an inner join right after.我必须将 sql 查询转换为 linq 并且我在左外连接和紧随其后的内连接方面遇到问题。 Here is the query below, can you help me?这是下面的查询,你能帮我吗?

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

My class(condensed):我的课(浓缩):

 public class tbl_offreSec
 {
     public int id { get; set; }
     public int FK_ecole { get; set; }
     public string description { get; set; }
     public Nullable<int> descriptionOrtho { get; set; }
     public int archive { get; set; }
 }

publi class tbl_ecoleSec
{
    public int id { get; set; }
    public int code { get; set; }
    public int FK_etablissement { get; set; }
}

public partial class ETABLISSEMENT
{
    public int ETAB_ID { get; set; }
    public int ETAB_CODE { get; set; }
    public string ETAB_NOM { get; set; }
}

UPDATE更新

In connection with the answer of Svyatoslav:关于 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);

So there is your query:所以有你的查询:

var query = 
   from os in ctx.tbl_offreSec
   join es in ctx.tbl_offreSec on os.FK_ecole equals es.code into gj
   from es in gj.DefaultIfEmpty()
   join et in ctx.ETABLISSEMENT on es.FK_etablissement equals et.ETAB_CODE
   where os.archive == 0 && os.descriptionOrtho == 0 and os.description.Length > 1 
   group et by new { et.ETAB_NOM, et.ETAB_CODE } into g
   select new 
   {
      g.Key.ETAB_NOM, 
      g.Key.ETAB_CODE,
      nbFiches = g.Sum(x => x.ETAB_NOM == null ? 0 : 1)
   }

var query = query.OrderBy(e => e.ETAB_NOM);

Also consider to do not use LEFT JOIN, since following INNER JOIN will filter out empty records.还要考虑不要使用 LEFT JOIN,因为遵循 INNER JOIN 会过滤掉空记录。

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

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