LINQ/Lambda - 在使用 Include 获取子对象时获取父对象 属性
LINQ/Lambda - Getting parent object property while using Include to obtain children
我正在使用上一个问题中的 "model"。这里我有一个 Vehicle
、VehicleType
和 Price
实体。
public class Vehicle
{
public int Id {get; set;}
public string Name {get; set}
public int VehicleTypeId {get; set;}
public virtual VehicleType VehicleType {get; set;}
}
public class VehicleType
{
public int Id {get; set;}
public string VehicleTypeName {get; set}
public ICollection<Vehicle> Vehicles {get; set;}
public ICollection<Price> Prices {get; set;}
}
public class Price
{
public int Id {get; set;}
public int Price {get; set;}
public int VehicleTypeId {get; set;}
public virtual VehicleType VehicleType {get; set;}
}
VehicleType
实体充当与 Vehicle
实体和 Price
实体的关系。我正在尝试使用 LINQ 获取给定 Vehicle
的 Price
,基于它是 VehicleType
...
// Query #1 to get `Vehicle` name
var vehicle = dbContext.Vehicles.SingeOrDefault(v => v.Id = 1234);
string vehicleName = vehicle.Name;
// Query #2 to get lowest `Price` for `Vehicle`
var myVehiclePrice = dbContext.Vehicles.Include("VehicleType.Prices")
.SingleOrDefault(v => v.Id == 1234)
.VehicleType.Prices
.OrderBy(p => p.PriceAmount).FirstOrDefault()
我有两个查询来获取我想要的信息。有没有办法将这两个查询组合在一起以访问数据库一次?我尝试重新使用从第一个查询中获得的 vehicle
变量,但它代表单个实体并且无法使用仅适用于 object query
的 Include()
扩展。
我认为您误解了 Include
。它用于急切加载 entity 内容。对于使用实体 properties/aggregates 的选择性投影的查询,根本不需要它。
只需使用
,您就可以通过单次数据库行程收集车辆名称和最低价格
var info = dbContext.Vehicles
.Where(v => v.Id == 1234)
.Select(v => new
{
VehicleName = v.Name,
LowestPrice = v.VehicleType.Prices.Min(p => (int?)p.Price)
})
.SingleOrDefault();
我正在使用上一个问题中的 "model"。这里我有一个 Vehicle
、VehicleType
和 Price
实体。
public class Vehicle
{
public int Id {get; set;}
public string Name {get; set}
public int VehicleTypeId {get; set;}
public virtual VehicleType VehicleType {get; set;}
}
public class VehicleType
{
public int Id {get; set;}
public string VehicleTypeName {get; set}
public ICollection<Vehicle> Vehicles {get; set;}
public ICollection<Price> Prices {get; set;}
}
public class Price
{
public int Id {get; set;}
public int Price {get; set;}
public int VehicleTypeId {get; set;}
public virtual VehicleType VehicleType {get; set;}
}
VehicleType
实体充当与 Vehicle
实体和 Price
实体的关系。我正在尝试使用 LINQ 获取给定 Vehicle
的 Price
,基于它是 VehicleType
...
// Query #1 to get `Vehicle` name
var vehicle = dbContext.Vehicles.SingeOrDefault(v => v.Id = 1234);
string vehicleName = vehicle.Name;
// Query #2 to get lowest `Price` for `Vehicle`
var myVehiclePrice = dbContext.Vehicles.Include("VehicleType.Prices")
.SingleOrDefault(v => v.Id == 1234)
.VehicleType.Prices
.OrderBy(p => p.PriceAmount).FirstOrDefault()
我有两个查询来获取我想要的信息。有没有办法将这两个查询组合在一起以访问数据库一次?我尝试重新使用从第一个查询中获得的 vehicle
变量,但它代表单个实体并且无法使用仅适用于 object query
的 Include()
扩展。
我认为您误解了 Include
。它用于急切加载 entity 内容。对于使用实体 properties/aggregates 的选择性投影的查询,根本不需要它。
只需使用
,您就可以通过单次数据库行程收集车辆名称和最低价格var info = dbContext.Vehicles
.Where(v => v.Id == 1234)
.Select(v => new
{
VehicleName = v.Name,
LowestPrice = v.VehicleType.Prices.Min(p => (int?)p.Price)
})
.SingleOrDefault();