LINQ-To-SQL - 慢查询

时间:2011-11-28 16:49:42

标签: c# linq linq-to-sql

我只是想知道是否有人可以就如何改进我的查询提供任何建议。

基本上,它会将2行合并为1.行中唯一不同的是'Type'字符列('S'或'C')和值。我想要做的是选择一行,使用'S'值和'C'值,并计算差值(S-C)。

我的查询有效,但速度很慢 - 获得结果大约需要8秒钟,这对我的应用程序来说并不理想。我希望我能改变数据库结构,但我不能遗憾!

这是我的问题:

var sales = (from cm in dc.ConsignmentMarginBreakdowns
            join sl in dc.SageAccounts on new { LegacyID = cm.Customer, Customer = true } equals new { LegacyID = sl.LegacyID, Customer = sl.Customer }
            join ss in dc.SageAccounts on sl.ParentAccount equals ss.ID
            join vt in dc.VehicleTypes on cm.ConsignmentTripBreakdown.VehicleType.Trim() equals vt.ID.ToString() into vtg
            where cm.ConsignmentTripBreakdown.DeliveryDate >= dates.FromDate && cm.ConsignmentTripBreakdown.DeliveryDate <= dates.ToDate
            where (customer == null || ss.SageID == customer)
            where cm.BreakdownType == 'S'
            orderby cm.Depot, cm.TripNumber
            select new
            {
                NTConsignment = cm.NTConsignment,
                Trip = cm.ConsignmentTripBreakdown,
                LegacyID = cm.LegacyID,
                Costs = dc.ConsignmentMarginBreakdowns.Where(a => a.BreakdownType == 'C' && a.NTConsignment == cm.NTConsignment && a.LegacyID == cm.LegacyID && a.TripDate == cm.TripDate && a.Depot == cm.Depot && a.TripNumber == cm.TripNumber).Single().Value,
                Sales = cm.Value ?? 0.00m,
                Customer = cm.Customer,
                SageID = ss.SageID,
                CustomerName = ss.ShortName,
                FullCustomerName = ss.Name,
                Vehicle = cm.ConsignmentTripBreakdown.Vehicle ?? "None",
                VehicleType = vtg.FirstOrDefault().VehicleTypeDescription ?? "Subcontractor"
            });

2 个答案:

答案 0 :(得分:1)

实际上没有足够的信息来提供明智的意见。例如,每个表中有多少行?生成的T-SQL是什么样的?

我首先建议的是采取输出的T-SQL,生成查询计划并查找表或索引扫描。

答案 1 :(得分:1)

优化Linq to SQL查询时,最好的起点是SQL Server Profiler。在那里,您可以找到Linq to SQL正在生成的SQL代码。从那里,你可以玩linq查询,看看你是否可以让它写出更好的查询。如果这不起作用,您可以随时手动编写存储过程,然后将其从Linq调用到SQL。