浅拷贝-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的车库有三辆车。
我想把这个车库的汽车轮胎的价值加起来。(每个车轮有不同的值)
我想把这个车库的汽车轮圈的价值加起来。(每个轮圈有不同的值)
如何使用LinQ做到这一点?
我试着用这样的东西,但不起作用。
var allTiresValue = context.Garage.Sum(garage => garage.cars
.Sum(car => car.wheels
.Sum(wheel => wheel.tires
.Sum(tire => tire.value))));
它可能不起作用,因为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);
现在你所要做的就是把这个放在一个声明中。