2

我有 2 个表之间的多对多关系。

其中一项功能包括删除导航表中的所有记录,然后重新填充它。

我使用实体框架,首先删除相关记录,然后通过以下方式重新填充集合:

foreach (var funcionario in listFuncionario)
{
    int fun_id = 0;
    if (!int.TryParse(funcionario.Trim(), out fun_id))
        continue;
    var fun = db.Funcionario.Find(fun_id);
    fun.Servicio.ToList().ForEach(s => db.Servicio.Remove(s));
    fun.Servicio.Clear();
    foreach (var servicio in listServicio)
        fun.Servicio.Add(db.Servicio.Find(servicio));
}
db.SaveChanges();

这些循环非常慢(特别是删除),但是,当我使用ExecuteSqlCommand直接发出DELETEINSERT语句时,循环很快。

我不喜欢直接发出 SQL 命令,因为失去了实体框架和面向对象编程的本质。您是否知道使用实体框架以更有效的方式做到这一点?

问候,詹姆

4

1 回答 1

1

对于listFuncionario您中的每个 Id,执行一个单独的查询 ( db.Funcionario.Find)。Funcionario您可以通过一次获得所有记录来加快速度。您需要先解析 Id 并将它们存储在 a 中List<int>,比方说idList

var funs = db.Funcionario.Where(f => idList.Contains(f.Id));

但是您可以通过Servicio同时加载集合来进一步优化:

var funs = db.Funcionario
             .Include("Servicio") // Or .Include(f => f.Servicio)
             .Where(f => idList.Contains(f.fun_id));

现在你可以做

foreach(var fun in funs.ToList())
{
    fun.Servicio.ForEach(s => db.Servicio.Remove(s);
}

您可以对要添加的对象进行相同的一次性查找Servicio,因此最终的解决方案是:

var servicio = db.Servicio.Where(s => listServicio.Contains(s.Id)).ToList();

var funs = db.Funcionario
             .Include("Servicio") // Or .Include(f => f.Servicio)
             .Where(f => idList.Contains(f.Id));

foreach(var fun in funs.ToList())
{
    fun.Servicio.ForEach(s => db.Servicio.Remove(s);
    foreach(var serv in servicio)
    {
        fun.Servicio.Add(serv);
    }
}

我认为Clearoffun.Servicio是没有必要的。

于 2013-10-06T22:18:14.890 回答