我使用Entity Frameworks 6.0.2将Observable集合中的记录保存到表中是代码
foreach(var item in obcollection)
{
cid=InsertClaimsInfoes;
}
private long InsertClaimsInfoes()
{
using (OptimusEntities opt = new OptimusEntities())
{
var x = cc.Provider.Split(',')[1];
var patf = cc.PatientName.Split(',')[1];
var patl = cc.PatientName.Split(',')[0];
var z = opt.Providers.Where(i => i.ProviderFirstName.ToLower().Trim() == x.ToLower().Trim()).FirstOrDefault().Id;
ClaimsInfo _claimInfo = new ClaimsInfo();
{
_claimInfo.Id = Convert.ToInt64(opt.ClaimsInfoes.Max(i => i.Id) + 1);
_claimInfo.BatchID = 1;
_claimInfo.ClientID = 122;
_claimInfo.PayorID = 0;
_claimInfo.ReceiverProviderId = opt.Providers.Where(i =>
i.ProviderFirstName.ToLower().Trim() == x.ToLower().Trim()).FirstOrDefault().Id;
_claimInfo.ServiceProviderId = _claimInfo.ReceiverProviderId;
_claimInfo.SubscriberId = _claimInfo.ReceiverProviderId;
_claimInfo.PatientId = opt.Patients.Any(i => i.FirstName.ToLower().Trim() == patf.ToLower().Trim()) ? opt.Patients.Where(j =>
j.FirstName.ToLower().Trim() == patf.ToLower().Trim()).FirstOrDefault().Id : InsertPatient(patf, patl, cc.DOB, 122, cc.Insurance);
_claimInfo.InsuranceName = cc.CarrierName;
_claimInfo.SelfClaim = true;
_claimInfo.DOSFrom = Convert.ToDateTime(cc.DOS);
_claimInfo.DOSTo = Convert.ToDateTime(cc.DOE);
_claimInfo.BillingDate = Convert.ToDateTime(cc.DOE);
_claimInfo.ClaimNum = cc.Insurance;
_claimInfo.SubmitAmount = Convert.ToDecimal(cc.BillValue);
}
//opt.Configuration.ProxyCreationEnabled = false;
opt.ClaimsInfoes.Add(_claimInfo);
opt.SaveChanges();
return _claimInfo.Id;
}
}
保存记录需要4-5秒。 ObservableCollection的大小超过1000.需要30分钟的aprox才能保存所有的Observable Collection。我在这里做错了多少时间。我能做些什么来改善表现。
答案 0 :(得分:3)
您正在创建与数据库每条记录的新连接,并单独保存每条记录。 SaveChanges
本质上是事务性的,将您的for
循环置于上下文中并对SaveChanges
进行一次调用,即
using (OptimusEntities opt = new OptimusEntities())
{
foreach(var item in obcollection)
{
...
}
opt.SaveChanges();
}
此外,您在执行插入操作之前似乎正在进行各种查询,这会导致每个请求1次访问数据库。如果您计划进行批量插入,我建议使用SqlBulkCopy类,因为它是far more efficient。