改进查询
本文关键字:查询 | 更新日期: 2023-09-27 18:30:35
我有两个列表。一个有新对象,让我们称之为NewCol,另一个是我从数据库中读出的(让我们称之为CurrentCol)。CurrentCol 大约有 120 万行(并且每天都会增长),NewCol 一次可以是 1 到数千行的任何内容。任何人都可以帮我改进以下代码,因为它运行得太慢了:
foreach (PortedNumberCollection element in NewCol)
{
if (CurrentCol.AsParallel().Select(x => x.MSISDN).Contains(element.MSISDN))
{
CurrentCol.AsParallel().Where(y => y.MSISDN == element.MSISDN)
.Select
(x =>
{
//if the MSISDN exists in both the old and new collection
// then update the old collection
x.RouteAction = element.RouteAction;
x.RoutingLabel = element.RoutingLabel;
return x;
}
);
}
else
{
//The item does not exist in the old collection so add it
CurrentCol.Add(element);
}
}
将
整个数据库读入内存并在那里搜索是一个非常糟糕的主意。搜索是数据库的优化对象。您可以做的最好的事情是以某种方式将整个代码移动到数据库中,例如,通过对NewCol
中的每个项目执行 MERGE 语句。
但是,如果你不能做到这一点,下一个最好的办法是将CurrentCol
制作为以MSISDN
为键的字典:
// Somewhere... Only once, not every time you want to add new items
// In fact, there shouldn't be any CurrentCol, only the dictionary.
var currentItems = CurrentCol.ToDictionary(x => x.MSISDN, x => x);
// ...
foreach(var newItem in NewCol)
{
PortedNumberCollection existingItem;
if(currentItems.TryGetValue(newItem.MSISDN, out existingItem)
{
existingItem.RouteAction = newItem.RouteAction;
existingItem.RoutingLabel = newItem.RoutingLabel;
}
else
{
currentItems.Add(newItem.MSISDN, newItem);
}
}