所以我相当成功地使用了实体框架,但一直在努力加快应用程序的运行时间。当我遍历记录时,我检查记录是否已经存在,我发现与获取内存中的所有记录并进行检查相比,为每条记录调用 dbcontext 以检查重复项会浪费大量时间。这是我一直在尝试做的。
有什么理由可以将这些存储在 IEnumerable 中吗?
实体框架非常棒,但速度慢得令人发指,而且我什至不是在谈论使用大型集合调用 .SaveChanges() 来更新/插入。似乎 dbContext 仅在需要时才获取记录,因此它对数据库进行了多次调用,而不是在内存中收集集合,并对其进行检查以节省浪费的 db 调用。
IEnumerable<pPeople> people;
IEnumerable<pPeople_Address> peopleAddress;
IEnumerable<pPeople_ContactNumbers> peopleNumbers;
IEnumerable<pPeople_EMail> peopleEmails;
private void button1_Click(object sender, EventArgs e)
{
using (CRMEntities crm = new CRMEntities())
{
people = crm.pPeoples.Where(p => p.import_num == ImportNumber).Select(p => p).AsEnumerable();
peopleAddress = crm.pPeople_Address.Where(a => a.import_num == ImportNumber).Select(a => a).AsEnumerable();
peopleNumbers = crm.pPeople_ContactNumbers.Where(n => n.import_num == ImportNumber).Select(n => n).AsEnumerable();
peopleEmails = crm.pPeople_EMail.Where(em => em.import_num == ImportNumber).Select(em => em).AsEnumerable();
}
}
我目前正在尝试调用诸如:第一个是我当前使用的方法,第二个是我想要使用的方法。
pPeople_Address recordExists = crm.pPeoples.Select(p => p.pPeople_Address.Where(a => a.People_ID == person.ID && a.Address1 == contactAddress.LINE1).FirstOrDefault()).FirstOrDefault();
pPeople_Address recordExists = peopleAddress.Where(a => a.People_ID == person.ID && a.Address1 == contactAddress.LINE1).FirstOrDefault();
解决方案: 我需要使用 .ToList() 来立即加载我的实体,而不是懒惰地加载。
这是我的单个实体调用现在的样子:
people = crm.pPeoples.Where(p => p.import_num == ImportNumber).Select(p => p).AsEnumerable().ToList();
稍后的电话采用以下形式:
pPeople_Address recordExists = people.Select(p => p.pPeople_Address.Where(a => a.People_ID == person.ID && a.Address1 == contactAddress.LINE1).FirstOrDefault()).FirstOrDefault();