LINQ/Lambda - 在使用 Include 获取子对象时获取父对象属性

本文关键字:对象 获取 属性 Include Lambda LINQ | 更新日期: 2023-09-27 18:34:11

我正在使用上一个问题中的这个"模型"。这里我有一个VehicleVehicleTypePrice实体。

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 根据给定VehicleVehicleType获取Price......

// 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 queryInclude()扩展。

LINQ/Lambda - 在使用 Include 获取子对象时获取父对象属性

我认为您误解了Include.它用于急切地加载实体内容。对于使用实体属性/聚合的选择性投影的查询,根本不需要它。

您可以通过单个数据库行程收集车辆名称和最低价格,只需使用

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();