Tengo una modelo

public class Document
{
        public int Id { get; set; }
        public int AttachId { get; set; }
        public Attachment Attach { get; set; }
        public string Description { get; set; }
}

Y quiero obtener una variedad de documentos agrupados por archivo adjunto. Primero en SQL escribí una consulta para agrupar:

select d."AttachId", count(d."AttachId")
    from "Documents" d
    group by d."AttachId"
    having (count(d."AttachId") > 0) 

Pero no puedo repetirlo en LINQ. La consulta

from docs in Documents
group docs by docs.AttachId into g
where g.Count() > 0
select new {count = g.Count(), AttachId = g.Key}

Me da un poco otro resultado, como:

SELECT
    Count(*),
    "AttachId"
FROM
    "Documents"
GROUP BY
    "AttachId"
HAVING
    Count(*) > 0

¿Es posible contar con AttachId en LINQ como en SQL count(d."AttachId")?

0
Sergiu 10 jul. 2021 a las 21:28

3 respuestas

La mejor respuesta

La única diferencia que surge entre su having count(column) > 0 y el having count(*) > 0 de EF es que su versión excluye los valores nulos.

... así que filtrarlos en el LINQ si están llegando y es un problema

from docs in Documents

where docs.AttachId != null

group docs by docs.AttachId into g
where g.Count() > 0
select new {count = g.Count(), AttachId = g.Key}
1
Caius Jard 10 jul. 2021 a las 19:55

Tu código sql escrito a mano

select d."AttachId", count(d."AttachId")
    from "Documents" d
    group by d."AttachId"
    having (count(d."AttachId") > 0) 

Es el equivalente a lo que genera EF Core. Las únicas cosas diferentes son: SELECT Count(*), ... y HAVING Count(*) > 0 que es lo mismo que escribir SELECT Count(AttachId) y HAVING Count(AttachId) porque el recuento de filas será el mismo para todos los campos.

0
Philipp Ape 10 jul. 2021 a las 19:25

Probar este código

sintaxis de linq

var result = (from d in Documents
      group d by d.AttachId into grp
      select new
      {
         AttachId = grp.Key,
         Items = grp
      }).Where(a => a.Items.Count() > 0).ToList();

sintaxis lambda

var result = Documents
     .GroupBy(a => a.AttachId)
     .Select(a => new
     {
        AttachId = a.Key,
        Items = a
     })
     .Where(a => a.Items.Count() > 0).ToList();
0
Meysam Asadi 10 jul. 2021 a las 19:55