Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQ到SQL-慢速查询_C#_Linq_Linq To Sql - Fatal编程技术网

C# LINQ到SQL-慢速查询

C# LINQ到SQL-慢速查询,c#,linq,linq-to-sql,C#,Linq,Linq To Sql,我只是想知道是否有人能就如何改进我的查询提供一些建议 基本上,它将把2行合并成1行。行之间唯一不同的是'Type'字符列('S'或'C')和值。我要做的是选择一行,用'S'值和'C'值,然后计算差值(S-C) 我的查询工作正常,但速度相当慢——大约需要8秒才能得到结果,这对我的应用程序来说并不理想。我希望我能改变数据库结构,但遗憾的是我不能 我的问题是: var sales = (from cm in dc.ConsignmentMarginBreakdowns join

我只是想知道是否有人能就如何改进我的查询提供一些建议

基本上,它将把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"
            });
var sales=(来自dc.CommissionMarginBreakdowns中的cm
在新{LegacyID=cm.Customer,Customer=true}等于新{LegacyID=sl.LegacyID,Customer=sl.Customer}的dc.SageAccounts中加入sl
将ss加入sl.ParentAccount上的dc.SageAccounts等于ss.ID
将vt加入cm.CommissionTripBreakdown.VehicleType.Trim()上的dc.VehicleTypes中等于vt.ID.ToString()加入vtg
其中cm.CommissionTripBreakdown.DeliveryDate>=dates.FromDate&&cm.CommissionTripBreakdown.DeliveryDate a.BreakdownType='C'&&a.NT寄售==cm.NT寄售&&a.LegacyID==cm.LegacyID&&a.TripDate==cm.TripDate&&a.Depot==cm.Depot&&a.TripNumber==cm.TripNumber).Single()值,
销售额=厘米价值??0.00米,
客户=厘米客户,
SageID=ss.SageID,
CustomerName=ss.ShortName,
FullCustomerName=ss.Name,
车辆=cm.commitmentTripBreakdown.Vehicle??“没有”,
VehicleType=vtg.FirstOrDefault().VehicleTypeDescription??“分包商”
});

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


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

在优化Linq到SQL查询时,最好从SQL Server Profiler开始。在这里,您可以找到LINQtoSQL生成的SQL代码。从这里开始,您可以玩弄linq查询,看看是否可以让它编写更好的查询。如果这不起作用,您总是可以手工编写存储过程,然后从Linq到SQL调用它