请参阅此代码段:
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
调用实际上使用导入的记录填充表。
请帮忙吗?
答案 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();