对 Linq 的复杂 SQL 查询
Posted
技术标签:
【中文标题】对 Linq 的复杂 SQL 查询【英文标题】:Complicated SQL query to Linq 【发布时间】:2018-02-08 09:10:53 【问题描述】:我需要将以下复杂的 sql 查询转换为 C# 中的 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
目前我已经拥有以下内容:
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( );
如何添加COUNT(Vacante.CveVacante) as Visitas
以及
GROUP BY Empleador.NombreComercial,Vacante.Puesto, Vacante.Actividades,
Vacante.CveVacante HAVING COUNT(*) > 1 ORDER BY Visitas DESC
我的 linq 查询?我找不到有关如何完成此操作的信息。这些表是 tvacante、 Templeador 和 tvisitaVacante。
【问题讨论】:
有什么理由需要转换它吗?你能在数据库上创建一个 SP 并调用它吗? ***.com/questions/2078736/… 是的,我需要转换它,因为我需要通过这个查询填充一个reportViewer,在我使用sqlCommand 填充reportviewer 之前,但是我的老板要求我使用Linq,这就是原因 【参考方案1】:试试这个:
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 newtEmpleador.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);
如果您只想使用 linq 查询语法而不是合并两种语法,那么您也可以这样做:
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 newtEmpleador.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()
;
【讨论】:
非常感谢您的帮助,您的查询似乎很完美,但缺少一些东西,因为 sqlcommand 返回 34 行而您的 linq 查询仅返回 30 行,无论如何您的帮助很好,谢谢你会检查为什么 linq 查询返回的结果比 sqlcommand 少 哦是因为你的sql查询中的左连接,我正在做内连接。看看这个帖子:***.com/questions/17142151/… 谢谢兄弟的大力帮助 @JasBalance,我现在看到你是 *** 的新用户。如果您认为我帮助您解决了问题,请考虑检查选票下方的复选标记。这意味着问题已经回答了,看看这个页面:***.com/help/someone-answers以上是关于对 Linq 的复杂 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章
Linq2Sql - 存储复杂的Linq查询以便将来动态执行 - 原始文本 - 可能吗?