亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

linq 分組結果需要很長時間

linq 分組結果需要很長時間

C#
米琪卡哇伊 2021-11-07 19:06:00
我有以下方法可以進行一些分組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的記錄。有沒有我沒有看到的性能提升器?
查看完整描述

2 回答

?
慕村225694

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.

這樣您就可以在數據庫端進行雙重分組。另外,我直到最后才將整個系列具體化。


查看完整回答
反對 回復 2021-11-07
?
四季花海

TA貢獻1811條經驗 獲得超5個贊

檢查中生成的查詢SQL Profiler。您的查詢正在(N+1 problem)vehicle和 中的每條記錄進行選擇plans。如果您正在使用Entity Framework 2.0,您應該知道它在GroupBy本地運行并將所有數據從數據庫中提取到內存中SELECT *,然后將它們分組到內存中。將您的查詢分解為每個實體的多個查詢。不要LINQFirst()SelectLINQ函數中那樣使用函數,因為它會導致N+1 SQL Issue. 將您的 EF 版本升級到 2.1 或更高版本以避免Local GroupBy出現問題。


查看完整回答
反對 回復 2021-11-07
  • 2 回答
  • 0 關注
  • 247 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號