浅拷贝-LINQ-如何从列表的列表中求和值-从数据库-实体

本文关键字:列表 实体 数据库 求和 -LINQ- 浅拷贝 | 更新日期: 2023-09-27 18:21:03

我有个问题。

下面是我的实体模型示例。

{
class Garage{
    long height;
    IEnumerable<Car> cars;
}
class Car{
    IEnumerable<Wheel> wheels;
}
class Wheel{
    IEnumerable<Tire> tires;
    IEnumerable<Rim> rims;
}
class Tire{
    decimal value;
    float width;
}
class Rim{
    decimal value;
    float weight;
}

在databese中,我有一个id=1的车库,有五辆车,id=2的车库有三辆车。

  1. 我想把这个车库的汽车轮胎的价值加起来。(每个车轮有不同的值)

  2. 我想把这个车库的汽车轮圈的价值加起来。(每个轮圈有不同的值)

如何使用LinQ做到这一点?

我试着用这样的东西,但不起作用。

var allTiresValue = context.Garage.Sum(garage => garage.cars
                                  .Sum(car => car.wheels
                                  .Sum(wheel => wheel.tires
                                  .Sum(tire => tire.value))));

它可能不起作用,因为linq正在创建"浅拷贝",但我不知道如何使它起作用:/

浅拷贝-LINQ-如何从列表的列表中求和值-从数据库-实体

我想这不是你真正的EF模型,因为你的列和关系不是用属性表示的,但我想你有那些导航属性。

如果你想找到属于特定Garage的所有汽车的Rims值和Tires值,你可以这样做:

var garageId=1;
var query=from car in context.Cars
          where car.GarageId==garageId
          select new {
                        CarTiresValue= car.Wheels.SelectMany(w=>w.Tires).Sum(t=>t.Value),
                        CarRimsValue=car.Wheels.SelectMany(w=>w.Rims).Sum(r=>r.Value)
                     };

我想在您的例子中,您想要所有车库中所有汽车所有车轮的所有轮胎的所有值的总和。

如果你有一个所有轮胎的序列,那么你只需要求和它们的值。

在linq中,每当您看到一个序列,并且您想要一个序列时,就使用SelectMany。

例如,一所学校有一个班级序列,每个班级都有一个学生序列。获取学校所有学生的一个序列:

var allPupiles = School.SelectMany(class => class.Pupils).

在你的例子中:要获得所有车库中所有汽车的所有车轮的总值:

var allGarages = context.Garage;
var allCars = allGarages.SelectMany(garage => garage.Cars);
var allWheels = allCars.SelectMany(car => car.Wheels);
var totalValue = allWheels.Sum(wheel => wheel.Value);

现在你所要做的就是把这个放在一个声明中。