我正在使用LinqToSQL从SQL Server处理数据,将其转储到iSeries服务器进行进一步处理。关于这方面的更多细节,请点击此处。
我的问题是处理这350行数据需要大约1.25分钟。我仍在尝试解密来自SQL Server Profiler的结果,但运行了大量查询。以下是我正在做的一些详细信息:
我的问题是处理这350行数据需要大约1.25分钟。我仍在尝试解密来自SQL Server Profiler的结果,但运行了大量查询。以下是我正在做的一些详细信息:
using (CarteGraphDataDataContext db = new CarteGraphDataDataContext())
{
var vehicles = from a in db.EquipmentMainGenerals
join b in db.EquipmentMainConditions on a.wdEquipmentMainGeneralOID equals b.wdEquipmentMainGeneralOID
where b.Retired == null
orderby a.VehicleId
select a;
et = new EquipmentTable[vehicles.Count()];
foreach (var vehicle in vehicles)
{
// Move data to the array
// Rates
GetVehcileRates(vehicle.wdEquipmentMainGeneralOID);
// Build the costs accumulators
GetPartsAndOilCosts(vehicle.VehicleId);
GetAccidentAndOutRepairCosts(vehicle.wdEquipmentMainGeneralOID);
// Last Month's Accumulators
et[i].lastMonthActualGasOil = GetFuel(vehicle.wdEquipmentMainGeneralOID) + Convert.ToDecimal(oilCost);
et[i].lastMonthActualParts = Convert.ToDecimal(partsCost);
et[i].lastMonthActualLabor = GetLabor(vehicle.VehicleId);
et[i].lastMonthActualOutRepairs = Convert.ToDecimal(outRepairCosts);
et[i].lastMonthActualAccidentCosts = Convert.ToDecimal(accidentCosts);
// Move more data to the array
i++;
}
}
所有的Get方法看起来都很相似:
private void GetPartsAndOilCosts(string vehicleKey)
{
oilCost = 0;
partsCost = 0;
using (CarteGraphDataDataContext db = new CarteGraphDataDataContext())
{
try
{
var costs = from a in db.WorkOrders
join b in db.MaterialLogs on a.WorkOrderId equals b.WorkOrder
join c in db.Materials on b.wdMaterialMainGeneralOID equals c.wdMaterialMainGeneralOID
where (monthBeginDate.Date <= a.WOClosedDate && a.WOClosedDate <= monthEndDate.Date) && a.EquipmentID == vehicleKey
group b by c.Fuel into d
select new
{
isFuel = d.Key,
totalCost = d.Sum(b => b.Cost)
};
foreach (var cost in costs)
{
if (cost.isFuel == 1)
{
oilCost = (double)cost.totalCost * (1 + OVERHEAD_RATE);
}
else
{
partsCost = (double)cost.totalCost * (1 + OVERHEAD_RATE);
}
}
}
catch (InvalidOperationException e)
{
oilCost = 0;
partsCost = 0;
}
}
return;
}
我的想法是减少查询数据库的次数应该能加快处理速度。如果LINQ为每个记录执行SELECT语句,也许我需要先将每个记录加载到内存中。
我仍然认为自己在C#和OOP方面是一个初学者(我主要在iSeries上进行RPG编程)。所以我猜我做了一些愚蠢的事情。你能帮我解决这个问题吗?
更新:我想回来告诉你我发现了什么。看起来数据库设计很差。无论LINQ在后台生成什么,它都是高度低效的代码。我不是说LINQ不好,只是对于这个数据库来说不好。我转换成一个快速拼凑出来的.XSD设置,处理时间从1.25分钟降至15秒。一旦我进行适当的重新设计,我只能猜测我会再节省几秒钟。谢谢大家的评论。我会在其他更好的数据库上尝试LINQ。