Tengo las siguientes consultas:
var truckCount = await DbContext.Trucks .Where(t => t.Departure == null) .CountAsync(); var firstTruck = await DbContext.Trucks .Where(t => t.Departure == null) .MinAsync(t => t.Arrival); var railcarCount = await DbContext.Railcars .Where(r => r.Departure == null) .CountAsync(); var firstRailcar = await DbContext.Railcars .Where(t => t.Departure == null) .MinAsync(t => t.Arrival);¿Alguien puede decirme si es posible combinar estas consultas en una sola para que solo haya un viaje de ida y vuelta a la base de datos?
Estaría buscando generar una consulta como esta.
select (select count(*) from Trucks where Departure is null) as TruckCount, (select min(Arrival) from Trucks where Departure is null) as FirstTruck, (select count(*) from Railcars where Departure is null) as RailcarCount, (select min(Arrival) from Railcars where Departure is null) as FirstRailcarMi backend es SQL Server.
No con linq, no. ¿Por qué? Por dos razones:
Para ser honesto, eso sería difícil de lograr incluso con una consulta sql ya que los datos tienen diferentes tipos de datos y columnas.
Debe usar una biblioteca de terceros que permita ejecutar múltiples consultas en un solo viaje de ida y vuelta a la base de datos. Tal vez esta extensión con sus consultas futuras funcione para usted.
De lo contrario, podría implementar un procedimiento almacenado que encapsule las consultas (como subconsultas) y devuelva la información deseada.
Otra opción podría ser simplemente usar 2 consultas en lugar de 4:
var truckInfo = await DbContext.Trucks .GroupBy(t => t.Departure == null) .Where(g => g.Key == true) .Select(g => new { Count = g.Count(), FirstTruck = g.Min(t => t.Arrival) }) .FirstOrDefaultAsync() ?? new { Count = 0, FirstTruck = DateTime.MinValue }; // same for RailcarsPor si acaso, existe la extensión linq2db.EntityFrameworkCore de EF Core (tenga en cuenta que soy uno de los creadores) que puede ejecutar esta consulta y casi cualquier consulta SQL ANSI a través de LINQ
using var db = DbContext.CreateLinqToDBConnection(); var trucks = DbContext.Trucks .Where(t => t.Departure == null); var railcars = DbContext.Railcars .Where(r => r.Departure == null); var result = await db.SelectAsync(() => new { TruckCount = trucks.Ccount(), FirstTruck = trucks.Min(t => t.Arrival), RailcarCount = railcars.Count(), FirstRailcar = railcars.Min(t => t.Arrival) });