我有一些看起来像这样的代码,使用 .NET 3.5(客户要求):
void Process (ActionState state)
{
var orderItemQuery = from OrderItem item in order.OrderItems
orderby item.OrderLineNumber ascending
select item;
foreach (OrderItem item in orderItemQuery)
{
ActionData actionData;
switch (state)
{
case ActionState.Prepare:
actionData = (
from ActionData ad in db.ActionDataTable
where ad.ObjectId == item.ProductId
select ad
).First();
case ActionState.QualityCheck:
actionData = (
from ActionData ad in db.ActionDataTable
where ad.ObjectId == item.OrderItemId
select ad
).First();
default:
throw new InvalidOperationException();
}
// ...
}
}
本质上,第一个查询的结果是迭代的,并且使用特定的外键从数据库中获取ActionData
记录,基于当前的ActionState
. 实际上,这里和那里有更多的嵌套和一些检查,但本质上是相同的。
这最初对测试数据库很有效,但是一个客户只是给我发了一份他们的实时数据的副本,而且速度非常慢。运行整个批次大约需要 15 分钟,包括其他一些处理。通过性能测试器运行代码后,我发现整个过程中最慢的部分是.First()
对每个案例的调用。
如果这是纯 SQL,我会根据 的值在循环外编译一个存储过程state
,然后使用它。既然我做不到,那还有什么办法呢?我怎样才能加快速度?