返回连接两个表的 IQueryable

cra*_*aig 1 c# linq entity-framework-core

此服务方法将返回IQueryable<Vehicle>:

public IQueryable<Vehicle> GetVehicles()
{
    return
        from v in _context.Vehicles
        where
            v.Schedule == true
            && v.Suspend == false
        select v;
}
Run Code Online (Sandbox Code Playgroud)

如果我想在查询中包含另一个表:

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 };

}
Run Code Online (Sandbox Code Playgroud)

正确的返回类型是什么IQueryable<T>? IQueryable<{vehicle,repair}>不正确。

有没有更好的方法来撰写select声明?

** 编辑 **

我希望保持简单,但我认为澄清是有用的。

ServiceIntervals实际上是IQueryable<T>引用另一个 SQL DB 中的表值函数的 :

public IQueryable<ServiceInterval> ServiceIntervals(DateTime startingDate, DateTime endingDate) =>
    Query<ServiceInterval>().FromSql($@"
        SELECT *
        FROM OtherDatabase.Dbo.ServiceIntervals({startingDate}, {endingDate})"
    );
Run Code Online (Sandbox Code Playgroud)

原始查询实际上包含日期:

...
_context.ServiceIntervals(DateTime.Now.Date,DateTime.Now.Date)
...
Run Code Online (Sandbox Code Playgroud)

因此,我认为不能ServiceIntervals作为实体上的导航属性公开Vehicle。

Sea*_*ler 5

在 LINQ 中执行操作select new {}会创建一个匿名类型,根据定义,该类型是匿名的,并且不能用作返回类型。如果你想返回这个变量,你必须为它创建一个类型。

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 };

}
Run Code Online (Sandbox Code Playgroud)

您可以更改自定义 DTO 类中的类型和变量名称以匹配 的类型_context.ServiceIntervals(我假设它被称为ServiceInterval)。