Идеи запросов LINQ для этой структуры таблицы - PullRequest
0 голосов
/ 21 декабря 2011

Я знаю, что это довольно необычный вопрос, но я потратил немного времени, пытаясь найти самый быстрый способ извлечения данных из необычно структурированной базы данных. По сути, база данных выглядит так:

'Поездка' - красивая и просто структурированная таблица, здесь никаких проблем

«Грузы» - каждая партия ссылается на поездку выше. Интересно и досадно, что каждая партия имеет в таблице 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 ... бла-бла), но это даже медленнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...