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

时间:2016-02-11 19:47:10

标签: c# entity-framework linq lambda linq-to-entities

我正在使用上一个问题的“模型”。我在这里有一个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来获取给定Price的{​​{1}},基于Vehicle ...

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之外工作的Include()扩展名。

1 个答案:

答案 0 :(得分:2)

我认为你误解了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();