2 回答
TA贡献1880条经验 获得超4个赞
我正在尝试将您的查询转换为对数据库更友好的版本。
var vehicles = vehiclesAndQuotes
.GroupBy(vehicleAndQuote =>
new {
vehicleAndQuote.Vehicle.VehicleMakeName,
vehicleAndQuote.Vehicle.VehicleModelTypeName,
vehicleAndQuote.Vehicle.VehicleEdition
})
.Select(a => new {
// DB friendly
vehicle = a.First(),
plans = a.GroupBy(quote => quote.Quote.YearlyMileage)
})
.AsEnumerable() // May o may not be needed / passing to LINQ to Objects
.Select(a => {
var vehicle = _mapper.Map<VehicleAndQuote, CatalogVehicle>(a.vehicle);
var plans = a.plans.Select(group => _mapper.Map<IEnumerable<VehicleAndQuote>, LeasingPlan>(group));
vehicle.LeasingPlans = plans;
return vehicle;
});
return vehicles.ToList(); // This should be avoided, specially if you are processing a large collection.
这样您就可以在数据库端进行双重分组。另外,我直到最后才将整个系列具体化。
TA贡献1811条经验 获得超5个赞
检查中生成的查询SQL Profiler
。您的查询正在(N+1 problem)
对vehicle
和 中的每条记录进行选择plans
。如果您正在使用Entity Framework 2.0
,您应该知道它在GroupBy
本地运行并将所有数据从数据库中提取到内存中SELECT *
,然后将它们分组到内存中。将您的查询分解为每个实体的多个查询。不要LINQ
像First()
在Select
LINQ函数中那样使用函数,因为它会导致N+1 SQL Issue
. 将您的 EF 版本升级到 2.1 或更高版本以避免Local GroupBy
出现问题。
- 2 回答
- 0 关注
- 217 浏览
添加回答
举报