【发布时间】:2019-01-07 02:39:03
【问题描述】:
我有以下方法可以进行一些分组
private List<CatalogVehicle> GroupResult(IEnumerable<VehicleAndQuote> vehiclesAndQuotes)
{
var vehicles = vehiclesAndQuotes
.GroupBy(vehicleAndQuote =>
new
{
vehicleAndQuote.Vehicle.VehicleMakeName,
vehicleAndQuote.Vehicle.VehicleModelTypeName,
vehicleAndQuote.Vehicle.VehicleEdition
})
.Select(a => new
{
vehicle = _mapper.Map<VehicleAndQuote, CatalogVehicle>(a.First()),
plans = GetLeasingpPlansGroupedByYearlyMileages(a.ToList()) //<== this one is taking ages
})
.Select(a =>
{
a.vehicle.LeasingPlans = a.plans;
return a.vehicle;
});
return vehicles.ToList();
}
以及在其中调用的方法;
private List<LeasingPlan> GetLeasingpPlansGroupedByYearlyMileages(IEnumerable<VehicleAndQuote> vehicleAndQuotes)
{
return vehicleAndQuotes.GroupBy(quote => quote.Quote.YearlyMileage)
.Select(group => _mapper.Map<List<VehicleAndQuote>, LeasingPlan>(group.ToList()))
.ToList();
}
最后一种方法需要很长时间。
IEnumerable<VehicleAndQuote> vehiclesAndQuotes 大约有 30.000 条记录。
有没有我没有看到的性能提升器?
【问题讨论】:
-
第二种方法结束时不调用
ToList()怎么办?您真的需要列表,还是返回IEnumerable<T>就足够了?调用ToList()会创建一个全新的集合,这显然会影响性能,尤其是当元素数量开始变得足够大时。 -
实际上,您在查询中的所有位置都调用了
ToList()。也删除它们。 -
尝试在数据库端执行more。那些 ToList 造成了很多伤害。另外,尽量在SQL可翻译部分之后将automapper延迟到自己的select
-
@Tigran 让我试试..
-
该组已经实现了
IEnumerable<VehicleAndQuote>,所以你可以直接调用plans = GetLeasingpPlansGroupedByYearlyMileages(a)。 Automapper 也接受IEnumerable<T>作为源。