2017-08-30 1 views
1

je dois convertir les éléments suivants requête SQL compliquée à LINQ en C#:Compliqué requête SQL pour Linq

Select Empleador.NombreComercial as Empresa, 
Vacante.Puesto as Vacante, 
Vacante.Actividades, 
COUNT(Vacante.CveVacante) as Visitas 
from Vacante 
LEFT JOIN Empleador on Empleador.CveEmpleador=Vacante.CveEmpleador 
LEFT JOIN VisitaVacante on Vacante.CveVacante = VisitaVacante.CveVacante 
GROUP BY Empleador.NombreComercial,Vacante.Puesto, Vacante.Actividades, 
Vacante.CveVacante HAVING COUNT(*) > 1 ORDER BY Visitas DESC 

Pour le moment, je l'ai déjà les éléments suivants:

var Visitas = (from tvacante in db.VacanteT 
          join tEmpleador in db.EmpleadorT on tvacante.CveEmpleador equals tEmpleador.CveEmpleador 
          join tVisitaVacante in db.VisitaVacanteT on tvacante.CveVacante equals tVisitaVacante.CveVacante 
          select new 
          { 
           Empresa = tEmpleador.NombreComercial, 
           Vacante = tvacante.Puesto, 
           tvacante.Actividades, 
           Visitas = tvacante.CveVacante 

          }).GroupBy(); 

Comment puis-je ajouter le COUNT(Vacante.CveVacante) as Visitas et aussi le

GROUP BY Empleador.NombreComercial,Vacante.Puesto, Vacante.Actividades, 
Vacante.CveVacante HAVING COUNT(*) > 1 ORDER BY Visitas DESC 

à ma requête LINQ? Je ne peux pas trouver d'informations sur la façon de compléter cela. Les tables sont tvacante, templeador et tvisitaVacante.

+0

Y at-il une raison que vous devez le convertir? Pourriez-vous créer un SP sur la base de données et appeler cela? –

+0

https://stackoverflow.com/questions/2078736/linq-with-group-by-having-count –

+0

Oui, je dois le convertir car j'ai besoin de remplir un reportViewer par cette requête, avant que j'utilise sqlCommand pour remplir le viewer mais mon patron m'a demandé d'utiliser Linq, c'est pourquoi –

Répondre

1

Essayez ceci:

var Visitas =(from tvacante in db.VacanteT 
       join tEmpleador in db.EmpleadorT on tvacante.CveEmpleador equals tEmpleador.CveEmpleador 
       join tVisitaVacante in db.VisitaVacanteT on tvacante.CveVacante equals tVisitaVacante.CveVacante 
       group new{tEmpleador.NombreComercial,tvacante.Puesto, tvacante.Actividades} by new {tEmpleador.NombreComercial,tvacante.Puesto, tvacante.Actividades} into g 
       where g.Count()>1 
       select new 
       { 
       Empresa = g.Key.tEmpleador.NombreComercial, 
       Vacante = g.Key.tvacante.Puesto, 
       Actividades= g.Key.tvacante.Actividades, 
       Visitas = g.Count() 
       }).OrderByDescending(e=>e.Visitas); 

Si vous voulez le faire en utilisant uniquement la syntaxe de requête LINQ et non la fusion à la fois la syntaxe, vous pouvez aussi le faire:

var Visitas = from tvacante in db.VacanteT 
       join tEmpleador in db.EmpleadorT on tvacante.CveEmpleador equals tEmpleador.CveEmpleador 
       join tVisitaVacante in db.VisitaVacanteT on tvacante.CveVacante equals tVisitaVacante.CveVacante 
       group new{tEmpleador.NombreComercial,tvacante.Puesto, tvacante.Actividades} by new {tEmpleador.NombreComercial,tvacante.Puesto, tvacante.Actividades} into g 
       where g.Count()>1 
       orderby g.Count() descending 
       select new 
       { 
       Empresa = g.Key.tEmpleador.NombreComercial, 
       Vacante = g.Key.tvacante.Puesto, 
       Actividades= g.Key.tvacante.Actividades, 
       Visitas = g.Count() 
       }; 
+0

merci beaucoup, j'apprécie votre aide, votre requête semble être parfaite mais quelque chose manque car la commande sql renvoie 34 lignes et votre requête linq renvoie seulement 30 lignes, de toute façon votre aide c'est génial, merci je vérifie pourquoi la requête linq retourne moins de résultats que la sqlcommand un –

+0

Oh c'est parce que la gauche se joint à votre requête SQL, je fais plutôt des jointures internes. Jetez un oeil ce poste: https://stackoverflow.com/questions/17142151/linq-to-sql-multiple-tables-left-outer-join – octavioccl

+0

Merci frère pour votre grande aide –