批量使用LINQ查找/匹配和更新记录?

基本上,我在数据库中有一个Items表,其中的项目库存需要经常更新.我在XML Feed中有更新的库存值.

这并不一定意味着表和XML提要中的项目数必须相同.我目前在数据库中大约有9K项,在XML中有72K项.

这是我到目前为止尝试过的:

Using context As New QuotationDbContext
    For Each item In context.Items.Where(Function(i) i.Active)
        Dim matchedNode = 
            xDoc.Descendants("item").   'xDoc is an XDocument object.
                 FirstOrDefault(Function(n) n.Attribute("itemcode").Value = item.ItemNumber)
        If matchedNode IsNot Nothing Then item.Stock = matchedNode.Attribute("stock").Value
    Next
    context.SaveChanges()
End Using

..以及另一种方法:

Using context As New QuotationDbContext
    For Each itemNode In xDoc.Descendants("item")
        Dim itemNumber As String = itemNode.Attribute("itemcode").Value
        Dim matchedItem = context.Items.FirstOrDefault(Function(i) i.Active AndAlso
                                                                   i.ItemNumber = itemNumber)
        If matchedItem IsNot Nothing Then matchedItem.Stock = itemNode.Attribute("stock").Value
    Next
    context.SaveChanges()
End Using

问题在于,这两种方法都需要花费超过2分钟的时间来进行“匹配和更新”,而更新所有项目则需要花费几百毫秒的时间,因此很明显,匹配是花费所有时间的过程.

因此,是否存在更好的(快速)方式来批量匹配/查找数据库中的记录以进行更新?

我认为解决我的问题的方法很可能是纯LINQ解决方案,而不必连接到EF.我想提供完整的上下文,以防万一我丢失了一些东西.

附言尽管我的代码在VB中,但是非常感谢C#代码的所有答案.

最佳答案
我认为这主要是算法问题.
您花费大量时间在xml中查找项目.
这里:

Dim matchedNode = 
        xDoc.Descendants("item").
             FirstOrDefault(Function(n) n.Attribute("itemcode").Value = item.ItemNumber)

例如,尝试将所有项目从xml中获取到字典中.因为字典花费O(1)的时间来查找元素.就像这样(我没有IDE可以尝试以下代码):

Dim dict = xDoc.Descendants("item").ToDictionary(Function(n) n.Attribute("itemcode").Value)

Using context As New QuotationDbContext
    For Each item In context.Items.Where(Function(i) i.Active)
        If dict.ContainsKey(item.ItemNumber) Then
            item.Stock = dict(item.ItemNumber).Attribute("stock").Value
        End If
    Next
    context.SaveChanges()
End Using

转载注明原文:批量使用LINQ查找/匹配和更新记录? - 代码日志