我正在使用LinqToSQL处理来自SQL Server的数据以将其转储到iSeries服务器中以供进一步处理。 More details on that here。速度更快? Struct数组或数据表
我的问题是需要大约1.25分钟来处理这350行数据。我仍然试图破译SQL Server Profiler的结果,但是有一些TON查询正在运行。下面是更详细一点上我在做什么:
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。
我自己的2美分数据表在这十年的代码中没有任何地方。 – 2010-03-11 14:02:00