Estoy utilizando LinqToSQL para procesar datos de SQL Server y volcarlos en un servidor iSeries para su posterior procesamiento. More details on that here.¿Qué es más rápido? Struct array o DataTable
Mi problema es que me toma aproximadamente 1.25 minutos procesar esas 350 filas de datos. Todavía estoy tratando de descifrar los resultados del Analizador de SQL Server, pero hay una TONELADA de consultas que se ejecutan. Aquí es un poco más detalle en lo que estoy haciendo:
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++;
}
}
los métodos de obtención de todo un aspecto similar a:
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;
}
Mi pensamiento aquí está reduciendo el número de consultas a la base de datos debería acelerar el procesamiento. Si LINQ hace un SELECCIONAR para cada registro, tal vez deba cargar todos los registros en la memoria primero.
Todavía me considero un principiante con C# y OOP en general (hago principalmente programación RPG en el iSeries). Así que supongo que estoy haciendo algo estúpido. ¿Puedes ayudarme a solucionar mi estupidez (al menos con este problema)?
Actualización: Pensé en volver y actualizar lo que he descubierto. Parece que la base de datos estaba mal diseñada. Lo que LINQ estaba generando en el fondo era un código altamente ineficiente. No digo que el LINQ sea malo, simplemente fue malo para esta base de datos. Convertí a una configuración .XSD rápidamente lanzada. El tiempo de procesamiento pasó de 1.25 minutos a 15 segundos. Una vez que hago un rediseño adecuado, solo puedo adivinar que me ahorraré algunos segundos más de eso. Gracias a todos por sus comentarios. Intentaré LINQ nuevamente algún otro día en una mejor base de datos.
Mis 2 centavos, tablas de datos no tienen ningún lugar en el código de esta década. –