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。
在 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)。
| 归档时间: |
|
| 查看次数: |
6396 次 |
| 最近记录: |