1

所以我相当成功地使用了实体框架,但一直在努力加快应用程序的运行时间。当我遍历记录时,我检查记录是否已经存在,我发现与获取内存中的所有记录并进行检查相比,为每条记录调用 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();
4

0 回答 0