改进查询

本文关键字:查询 | 更新日期: 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);
    }
}