2016-04-04 9 views
0

Ich versuche, eine Abfrage in meiner .net-Umgebung ausführen,SQL-Abfrage Konvertieren entspricht Linq

so ist, dass ich es in dem Linq-Äquivalent dieser Umwandlung die SQL-Abfrage

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 

und die folgenden bisher konvertierte ich habe:

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; 

aber jetzt versuche ich die nbre_jour Summe von 8 geteilt zu bekommen, hat jemand irgendwelche Hinweise auf, wie dies zu tun?

+0

erfordern würde wirklich Sie sollen versuchen, die Navigationseigenschaften verwenden anstelle von Joins, wenn Sie Linq wechseln https://coding.abel.nu/2012/06/dont-use-linqs-join-navigate/ – juharr

+0

es ist nicht meine Datenbank, und keine FK sind gemacht, also muss ich es so machen: / – Kiwi

Antwort

0

Zuerst möchten Sie wirklich die nbre_jour durch diese Werte gruppieren, damit Sie die Summe tun können.

group temps.nbre_jour by ... 

Dann wird Ihr wählen würde nur

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

Man denke nur an Gruppe Linq sein durch ähnliche

Gruppe < Dinge, die Sie > von < Spalten aggregieren möchten Sie gruppieren möchten >

In dem Fall, dass es mehr als eine Spalte aggregieren auf eine Lambda im Aggregatfunktion wie diese

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