Я использую LinqToSQL для обработки данных из SQL Server, чтобы выгрузить их на сервер iSeries для дальнейшей обработки. More details on that here.Что происходит быстрее? Массив Struct или DataTable
Моя проблема заключается в том, что для обработки этих 350 строк данных требуется около 1,25 минуты. Я все еще пытаюсь расшифровать результаты из 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++;
}
}
ГЭТ методы все похожи на:
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# и ООП вообще (в основном я программирую RPG на iSeries). Поэтому я предполагаю, что делаю что-то глупое. Можете ли вы помочь мне исправить мою глупость (по крайней мере, с этой проблемой)?
Обновление: Мысль о том, что я вернусь и уточню, что я обнаружил. Похоже, что база данных была плохо разработана. Независимо от того, что LINQ генерировал в фоновом режиме, это был очень неэффективный код. Я не говорю, что LINQ плохо, это просто плохо для этой базы данных. Я преобразовал в быстро сложенную комбинацию. Настройка XSD и время обработки пошли от 1,25 минуты до 15 секунд. Как только я сделаю правильный редизайн, я могу только догадываться, что я побей еще несколько секунд. Спасибо всем вам за комментарии. Я попробую LINQ снова через день в лучшей базе данных.
Мои собственные 2 цента, datatables не имеют никакого места в коде в этом десятилетии. –