Cette méthode de service retournera un IQueryable<Vehicle>
:
public IQueryable<Vehicle> GetVehicles()
{
return
from v in _context.Vehicles
where
v.Schedule == true
&& v.Suspend == false
select v;
}
Si je veux inclure une autre table dans la requête:
public IQueryable<Vehicle> GetVehicles()
{
return
from v in _context.Vehicles
join si in _context.ServiceIntervals on v.Id equals si.VehicleId into loj
from rs in loj.DefaultIfEmpty()
where
v.Schedule == true
&& v.Suspend == false
select new { vehicle = v, repair = rs };
}
Quel est le type de retour IQueryable<T>
correct? IQueryable<{vehicle,repair}>
n'est pas correct.
Existe-t-il une meilleure façon de composer l'instruction select
?
** Éditer **
J'espérais rester simple, mais je pense qu'une clarification est utile.
ServiceIntervals
est en fait un IQueryable<T>
qui fait référence à une fonction table d'une autre base de données SQL:
public IQueryable<ServiceInterval> ServiceIntervals(DateTime startingDate, DateTime endingDate) =>
Query<ServiceInterval>().FromSql($@"
SELECT *
FROM OtherDatabase.Dbo.ServiceIntervals({startingDate}, {endingDate})"
);
La requête d'origine comprend en fait des dates:
...
_context.ServiceIntervals(DateTime.Now.Date,DateTime.Now.Date)
...
En tant que tel, je ne pense pas que ServiceIntervals
puisse être exposé en tant que propriété de navigation sur l'entité Vehicle
.
La select new {}
dans LINQ crée un type anonyme qui, par définition, est anonyme et ne peut pas être utilisé comme type de retour. Si vous souhaitez renvoyer cette variable, vous devez créer un type pour elle.
public class VehicleServiceDTO
{
public Vehicle Vehicle { get; set; }
public ServiceInterval Repair { get; set; }
}
public IQueryable<VehicleServiceDTO> GetVehicles()
{
return
from v in _context.Vehicles
join si in _context.ServiceIntervals on v.Id equals si.VehicleId into loj
from rs in loj.DefaultIfEmpty()
where
v.Schedule == true
&& v.Suspend == false
select new VehicleServiceDTO() { Vehicle = v, Repair = rs };
}
Vous pouvez modifier les types et les noms de variables dans la classe DTO personnalisée pour qu'ils correspondent au type de _context.ServiceIntervals
(j'ai supposé que cela s'appelait ServiceInterval
).