繁体   English   中英

C#:优化LinQ查询

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM