У меня проблемы с оптимизацией поиска данных со следующей структурой данных:
Order
-----
Id
Customer
Date
... etc
OrderStatus
------
Id
OrderId
Date
UpdatedBy
StatusTypeId
...etc
Это вызывает у меня головную боль на странице Order List , которая в основном показывает список Orders
. Каждый Сводка заказа в списке показывает группу полей от Order
и текущего OrderStatus
, то есть OrderStatus
с самым последним Date
, который связан с Order
.
Order List
-------------------------------------------------------
Order Id | Customer | Order Date | CurrentStatus |
-------------------------------------------------------
1 | Someone | 1.10.2010 | Completed |
-------------------------------------------------------
2 | Someone else | 12.10.2010 | In Progress |
-------------------------------------------------------
3 | Whoever | 17.10.2010 | On Hold |
-------------------------------------------------------
Теперь, скажем, я хочу перечислить все заказы с этого года. Мой репозиторий извлекает Order
объекты
var orders = _repository.GetAllOrdersSinceDate(dt);
и теперь я получаю что-то вроде
foreach (Order order in orders)
{
OrderSummary summary = new OrderSummary();
summary.Customer = order.Customer;
summary.Date = order.Date;
// ...etc
// problem here!!
summary.OrderStatus = order.OrderStatus
.OrderByDescending(s => status.Date).First();
}
В результате я получаю оператор SELECT
для Order
, а затем еще один оператор SELECT
для OrderStatus
для каждого Order
возвращаемого значения.
Таким образом, для отображения сводки всех записей за этот год требуется около 20 000 отдельных запросов SQL и много минут загрузки.
Есть какой-нибудь аккуратный способ решить эту проблему?
Я подумываю переписать базу данных для хранения current OrderStatus
в таблице Order
, поэтому я получаю что-то вроде
Order
-----
Id
Customer
Date
CurrentStatusTypeId
CurrentStatusDate
CurrentStatusUpdatedBy
...etc
OrderStatusHistory
------
Id
OrderId
Date
UpdatedBy
StatusTypeId
...etc
это единственный способ, который я вижу, чтобы решить проблему, но кажется довольно неприятным решением.
Какой лучший путь вперед?