0

我有一个学生模型,其中有电话号码和地址列表。当我更新学生时,需要更新相关数据(电话和地址)。为此,我在我的学生控制器中编写了一个 PUT 动作。它工作正常,但我担心查询的效率。请检查代码并建议我即兴创作(如果有)。谢谢

 public async Task<IActionResult> Put(long id, [FromBody] Student student)
    {
        var p = await _Context.Students
            .Include(t => t.PhoneNumbers)
            .Include(t => t.Addresses)
            .SingleOrDefaultAsync(t => t.Id == id);

        if (p == null)
        {
            return NotFound();
        }

        _Context.Entry(p).CurrentValues.SetValues(student);

        #region PhoneNumber
        var existingPhoneNumbers = p.PhoneNumbers.ToList();
        foreach (var existingPhone in existingPhoneNumbers)
        {
            var phoneNumber = student.PhoneNumbers.SingleOrDefault(i => i.Id == existingPhone.Id);
            if (phoneNumber != null)
                _Context.Entry(existingPhone).CurrentValues.SetValues(phoneNumber);
            else
                _Context.Remove(existingPhone);
        }
        // add the new items
        foreach (var phoneNumber in student.PhoneNumbers)
        {
            if (existingPhoneNumbers.All(i => i.Id != phoneNumber.Id))
            {
                p.PhoneNumbers.Add(phoneNumber);
            }
        }
        #endregion


        #region Address
        var existingAddresses = p.Addresses.ToList();
        foreach (var existingAddress in existingAddresses)
        {
            var address = student.Addresses.SingleOrDefault(i => i.Id == existingAddress.Id);
            if (address != null)
                _Context.Entry(existingAddress).CurrentValues.SetValues(address);
            else
                _Context.Remove(existingAddress);
        }
        // add the new items
        foreach (var address in student.Addresses)
        {
            if (existingAddresses.All(i => i.Id != address.Id))
            {
                p.Addresses.Add(address);
            }
        }
        #endregion

        await _Context.SaveChangesAsync();

        return NoContent();
    }
4

1 回答 1

0

搜索小的内存集合通常不是您担心的事情。因此,如果一个学生有几十个或几百个地址,重复查找不会很重要,尤其是与写入数据库所需的时间相比。

如果您确实想要优化,您可以将学生地址复制到字典中。像这样:

    var existingAddresses = p.Addresses.ToList();
    var studentAddresses = student.Addresses.ToDictionary(i => i.Id);
    foreach (var existingAddress in existingAddresses)
    {
        if (studentAddresses.TryGetValue(existingAddress.Id, out Address address))
        {
            _Context.Entry(existingAddress).CurrentValues.SetValues(address);
        }
        else
        {
            _Context.Remove(existingAddress);
        }
    }

像这样对内存中的集合进行查询:

var address = student.Addresses.SingleOrDefault(i => i.Id == existingAddress.Id);

将简单地迭代所有 student.Addresses 比较 Id。Dictionary<> 就像一个索引,提供非常快速的查找。

于 2018-08-06T14:55:41.587 回答