[英]C#: Optimize LinQ query
我正在编写一个 LinQ 查询,其中一列是总计 (pscount),而且速度有点慢。 我很确定罪魁祸首是计算 pscount 的子选择,而且我也很确定可以优化此查询。 我怎样才能做到这一点?
var q =
from
finca in this.db.finca
join direccion in db.direccion
on new { id = finca.direccion_id } equals new { id = direccion.direccion_id }
join ambito in db.ambito_geografico
on new { id = direccion.ambito_id } equals new { id = (short?)ambito.ambito_id }
join acometida in this.db.acometida
on new { id = finca.acometida_defecto_id } equals new { id = acometida.acometida_id }
join planificacion in this.db.planificacion
on new { id = finca.planificacion_defecto_id } equals new { id = planificacion.planificacion_id }
select
new FincaViewModel
{
direccion = direccion.direccion_postal_1, //.direccion_postal_1,
ambito = ambito.descripcion,
acometida = acometida.nombre, //.nombre,
pscount = (
from p in this.db.puntosuministroview select p
).Where(psum => psum.concesion_id == finca.concesion_id
&& psum.planificacion_id == finca.planificacion_defecto_id
&& psum.acometida_id == finca.acometida_defecto_id).Count(),
concesion_id = finca.concesion_id,
planificacion = planificacion.nombre_planificacion,
disponible_contratacion = finca.disponible_contratacion ? General.Si : General.No,
};
尝试以下查询:
var countsQuery =
from p in this.db.puntosuministroview
group p by new { p.concesion_id, p.planificacion_id, p.acometida_i } into g
select new
{
g.Key.concesion_id,
g.Key.planificacion_id,
g.Key.acometida_i,
count = g.Count()
};
var q =
from
finca in this.db.finca
join direccion in db.direccion
on new { id = finca.direccion_id } equals new { id = direccion.direccion_id }
join ambito in db.ambito_geografico
on new { id = direccion.ambito_id } equals new { id = (short?)ambito.ambito_id }
join acometida in this.db.acometida
on new { id = finca.acometida_defecto_id } equals new { id = acometida.acometida_id }
join planificacion in this.db.planificacion
on new { id = finca.planificacion_defecto_id } equals new { id = planificacion.planificacion_id }
join c in countsQuery
on new { finca.concesion_id, finca.planificacion_id, finca.acometida_i } equals new { c.concesion_id, c.planificacion_id, c.acometida_i } into gj
from c in gj.DefaultIfEmpty()
select new FincaViewModel
{
direccion = direccion.direccion_postal_1, //.direccion_postal_1,
ambito = ambito.descripcion,
acometida = acometida.nombre, //.nombre,
pscount = ((int?)c.count) ?? 0,
concesion_id = finca.concesion_id,
planificacion = planificacion.nombre_planificacion,
disponible_contratacion = finca.disponible_contratacion ? General.Si : General.No,
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.