为什么这个批量插入不能按预期工作?

时间:2015-06-04 01:01:10

标签: c# .net sql-server linq entity-framework-5

请参阅此代码段:

while ((line = rdr.ReadLine()) != null)
{
    ....
    Departamento depto = db.Departamento.FirstOrDefault(d => d.DepNombre.Equals(departamento, StringComparison.InvariantCultureIgnoreCase));
    if (depto == null)
    {
        depto = new Departamento();
        depto.DepNombre = departamento;
        depto.Pais = pais;
        depto.DepCreadoEn = DateTime.Now;
        db.Departamento.Add(depto);
    }
    ...
}
db.SaveChanges();

如您所见,我有一个循环,它将数据插入数据库中的表Departamento。例如,这是从Excel工作表导入记录。

那" if"是否根据其名称(DepNombre)插入不在数据库中的记录。当该名称存在时,获取当前对象,这样它就不会在数据库表中出现两次。

正如您所看到的,出于性能原因,我在循环后调用SaveChanges()

奇怪的是,该对象目前尚未添加到集合中,因此," depto"对象总是返回null,多次添加记录。

例如,数据库中当前有1条记录。通过使用即时窗口,我可以调用db.Departamento.Count()并找到1条记录。 db.Departamento.Add调用后,我调用相同的Count()方法,然后再次返回1。在这种情况下,显然FirstOrDefault方法永远不会返回任何内容。

SaveChanges调用实际上使用导入的记录填充表。

请帮忙吗?

1 个答案:

答案 0 :(得分:0)

var list=new List<Departamento>();
/* Get from Excel */
while ((line = rdr.ReadLine()) != null)
{
    ....
    depto = new Departamento();
    depto.DepNombre = departamento;
    depto.Pais = pais;
    depto.DepCreadoEn = DateTime.Now;
    list.Add(depto);
}

/* Group By */
var list2=list.GroupBy(x=>x.DepNombre,(key,g)=>g.OrderBy(e=>e.DepCreadoEn).First());

/* Get list of DepNombre to exclude */
var badDepts=db.Departmento
  .Where(d=>list2.Any(l2=>l2.DepNombre==d.DepNombre))
  .Select(d=>d.DepNombre);

/* Exclude them */
var goodDepts=list2.Where(l=>!badDepts.Any(bd=>bd==l.DepNombre));

/* Add to database */
db.Departmento.AddRange(goodDepts);

/* Save */
db.SaveChanges();