将SQL查询转换为linq等效项

时间:2016-04-04 13:12:21

标签: c# linq

我试图在我的.net环境中执行查询,

所以我将它转换为linq等价物,这就是SQL查询

SELECT
  INFOCENTRE.dbo.issi_ressource.ressourec_text1,
  INFOCENTRE.dbo.issi_temps.annee_saisie,
  INFOCENTRE.dbo.issi_temps.mois_saisi,
  INFOCENTRE.dbo.issi_temps.semaine_saisie,
  INFOCENTRE.dbo.issi_temps.jour_saisi,
  INFOCENTRE.dbo.issi_engagement.engagement_nom,
  INFOCENTRE.dbo.issi_projet.projet_nom,
  INFOCENTRE.dbo.issi_tache.tache_nom,
  (sum(INFOCENTRE.dbo.issi_temps.nbre_jour))/8
FROM
  INFOCENTRE.dbo.issi_ressource INNER JOIN INFOCENTRE.dbo.issi_temps ON (INFOCENTRE.dbo.issi_temps.ressource_id=INFOCENTRE.dbo.issi_ressource.ressource_id)
   INNER JOIN INFOCENTRE.dbo.issi_tache ON (INFOCENTRE.dbo.issi_temps.tache_id=INFOCENTRE.dbo.issi_tache.tache_id)
   INNER JOIN INFOCENTRE.dbo.issi_projet ON (INFOCENTRE.dbo.issi_projet.projet_id=INFOCENTRE.dbo.issi_tache.projet_id)
   INNER JOIN INFOCENTRE.dbo.issi_engagement ON (INFOCENTRE.dbo.issi_projet.engagement_id=INFOCENTRE.dbo.issi_engagement.engagement_id)

WHERE
  ( 
  INFOCENTRE.dbo.issi_tache.tache_nom  NOT IN  ('Control for Complement day or week', 'Holidays (for internal only)', 'Miscellaneous absences (for internal only)', 'Part time (for internal only)', 'Sick time and job injuries (for internal only)')
  AND  INFOCENTRE.dbo.issi_ressource.ressourec_text1  =  'EDCL'
  AND  INFOCENTRE.dbo.issi_temps.jour_saisi  >= '2016-03-01'
  AND  INFOCENTRE.dbo.issi_temps.jour_saisi  < '2016-04-01'
  )
GROUP BY
  INFOCENTRE.dbo.issi_ressource.ressourec_text1, 
  INFOCENTRE.dbo.issi_temps.annee_saisie, 
  INFOCENTRE.dbo.issi_temps.mois_saisi, 
  INFOCENTRE.dbo.issi_temps.semaine_saisie, 
  INFOCENTRE.dbo.issi_temps.jour_saisi, 
  INFOCENTRE.dbo.issi_engagement.engagement_nom, 
  INFOCENTRE.dbo.issi_projet.projet_nom, 
  INFOCENTRE.dbo.issi_tache.tache_nom

并转换到目前为止我有以下内容:

from ressource in context.issi_ressource
join temps in context.issi_temps on ressource.ressource_id equals temps.ressource_id
join tache in context.issi_tache on temps.tache_id equals tache.tache_id
join projet in context.issi_projet on tache.projet_id equals projet.projet_id
join engagement in context.issi_engagement on projet.engagement_id equals engagement.engagement_id

where
    ressource.ressourec_text1 == "EDCK" &&
    temps.jour_saisi <= new DateTime(2016, 03, 01) &&
    temps.jour_saisi < new DateTime(2016, 04, 01) &&
    tache.tache_nom != "Control for Complement day or week" &&
    tache.tache_nom != "Holidays (for internal only)" &&
    tache.tache_nom != "Miscellaneous absences (for internal only)" &&
    tache.tache_nom != "Part time (for internal only)" &&
    tache.tache_nom != "Sick time and job injuries (for internal only)" 

group ressource by new {
    ressource.ressourec_text1,
    temps.annee_saisie,
    temps.mois_saisi,
    temps.semaine_saisie,
    temps.jour_saisi,
    engagement.engagement_nom,
    projet.projet_nom,
    tache.tache_nom
} into res

select res;

但是现在我试图将nbre_jour总和除以8,有没有人知道如何做到这一点?

1 个答案:

答案 0 :(得分:0)

首先,您确实希望按这些值对nbre_jour进行分组,以便您可以进行总和。

group temps.nbre_jour by ...

然后你的选择就是

select new
{
    res.Key.ressourec_text1,
    res.Key.annee_saisie,
    ...
    GiveThisAName = res.Sum()/8
}

想想Linq的小组就像这样

  

组&lt;您要汇总的内容&gt; by&lt;您想要分​​组的列&gt;

如果要聚合多个列,则需要在聚合函数中使用lambda

group  new { col1, col2 } by ... into grp
select new 
{ 
    grp.Key, 
    Col1Sum = grp.Sum(x => x.col1), 
    Col2Avg = grp.Average(x => x.col2) 
}