Я знаю, что это довольно необычный вопрос, но я потратил немного времени, пытаясь найти самый быстрый способ извлечения данных из необычно структурированной базы данных. По сути, база данных выглядит так:
'Поездка' - красивая и просто структурированная таблица, здесь никаких проблем
«Грузы» - каждая партия ссылается на поездку выше. Интересно и досадно, что каждая партия имеет в таблице 2 записи: одну для значения «Продажи» и одну для значения «Затраты» - они дифференцируются полем Char («S» или «C»). ).
Мой запрос в основном должен выбрать все партии товаров в диапазоне дат (дата хранится в таблице Поездки) с указанием значения продаж и затрат в строке. Вот мой запрос LINQ сейчас:
var cons = from cS in dc.Consignments.Where(a => a.BreakdownType == 'S')
join cC in dc.Consignments on new { NTConsignment = cS.NTConsignment, LegacyID = cS.LegacyID, TripDate = cS.TripDate, Depot = cS.Depot, TripNumber = cS.TripNumber, BreakdownType = 'C' } equals new { NTConsingment = cC.NTConsignment, LegacyID = cC.LegacyID, TripDate = cC.TripDate, Depot = cC.Depot, TripNumber = cC.TripNumber, BreakdownType = cC.BreakdownType }
join sl in dc.SageAccounts on new { LegacyID = cS.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 cS.Trip.VehicleType.Trim() equals vt.ID.ToString() into vtg
where cS.Trip.DeliveryDate >= dates.FromDate && cS.DeliveryDate <= dates.ToDate
orderby cS.Depot, cS.TripNumber
select new GMConsignment
{
NTConsignment = cS.NTConsignment,
Trip = cS.Trip,
LegacyID = cS.LegacyID,
Costs = cC.Value ?? 0.00m,
Sales = cS.Value ?? 0.00m,
Margin = (cS.Value ?? 0.00m) - (cC.Value ?? 0.00m),
Customer = cmS.Customer,
SageID = ss.SageID,
CustomerName = ss.ShortName,
FullCustomerName = ss.Name,
Vehicle = cS.Trip.Vehicle ?? "None",
VehicleType = vtg.SingleOrDefault().VehicleTypeDescription ?? "Subcontractor",
VehicleGroup = vtg.FirstOrDefault().VehicleGroup1
};
Проблема в том, что вышеописанное ужасно медленно. Я профилировал SQL, и я не делаю очевидных ошибок, таких как отсутствующие индексы. Я знаю, что существует миллион возможностей, почему запрос медленный, и это очень сложно, не зная об этом больше, но мне просто интересно, есть ли другие, и потенциально более быстрые способы выполнения того, что я делаю в LINQ?
Я также пытался выбрать 'Cost' в операторе 'Select' (т.е. Costs = dc.Costs.Where ... бла-бла), но это даже медленнее.