es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Contar registros no referenciados en otra tabla (problema de tabla uno-a-muchos con EF y LINQ)

¿Cómo puedo contar todos los registros de TimeLog que no están facturados (ver tablas a continuación), pero deberían ser facturados (isBillable), con Entity Framework y Linq?

dbo.TimeLogs

[Table(“TimeLogs”)]
public class TimeLogEntity
{
int Id {get; set;}
int IsBillable {get; set;}

List Invoices {get; set;}
}

dbo.Invoices

[Table(“Invoices”)]
public class InvoiceEntity
{
int Id {get; set;}
int TimeLogId {get; set;}
bool IsActive {get; set;}

TimeLogEntity TimeLog {get; set;}
}

Intenté esto pero sin éxito:

var numRows = await applicationDbContext.TimeLogs
.Include(t => t.Invoices.Where(i => i.IsActive == true))
.Where(t => t.IsBillable == true && t.IsActive == true && t.Invoices.Count == 0)
.CountAsync();

La consulta anterior produce esta consulta SQL (ver abajo), que no verifica si los registros de factura están activos o no. No quiero contar las facturas que tienen IsActive = false (se consideran eliminadas).

SELECT COUNT()
FROM [TimeLogs] AS [t]
WHERE (([t].[IsBillable] = CAST(1 AS bit)) AND ([t].[IsActive] = CAST(1 AS bit))) AND ((
SELECT COUNT(
)
FROM [Invoices] AS [i]
WHERE [t].[Id] = [i].[TimeLogId]) = 0)

Estoy utilizando Microsoft.AspNetCore.Identity.EntityFrameworkCore (6.0.1)

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para contar todos los registros de TimeLog que no están facturados pero deberían estarlo, con Entity Framework y Linq, puedes modificar la consulta para incluir una verificación de facturas activas:

    var numRows = await applicationDbContext.TimeLogs
       .Include(t => t.Invoices)
       .Where(t => t.IsBillable && !t.Invoices.Any(i => i.IsActive))
       .CountAsync();
    

    En esta consulta, estamos incluyendo la propiedad de navegación Invoices de la entidad TimeLogEntity para poder acceder a la propiedad IsActive de la factura. Luego, filtramos los TimeLogs para incluir solo aquellos que son facturables y no tienen facturas activas. Por último, contamos los TimeLogs resultantes.

    Esto debería resultar en una consulta SQL similar a:

    SELECT COUNT(*)
    FROM [TimeLogs] AS [t]
    WHERE ([t].[IsBillable] = 1) AND (
           SELECT COUNT(*)
           FROM [Invoices] AS [i]
           WHERE ([i].[IsActive] = 1) AND ([t].[Id] = [i].[TimeLogId])) = 0
    

    Esto debería contar correctamente todos los registros de TimeLog que no están facturados pero deberían estarlo, ignorando cualquier factura inactiva.

Comments are closed.