实体框架非常慢

本文关键字:非常 框架 实体 | 更新日期: 2023-09-27 17:54:52

我在一个组中有数千个联系人(联系人和组有多对多关系):

public class Group
{
    public int GroupID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Contact> Contacts { get; set; }
}
public class Contact
{
    public int ContactID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public virtual ICollection<Group> Groups { get; set; }
}

当我获取所有联系人时,需要半秒。没问题:

context.Contacts.ToList();

我试了一下,又花了不到一秒钟的时间:

 db.Contacts.SelectMany(s => s.Groups.Where(c => c.GroupID == 1)).ToList();

然而,这需要15秒来加载(它挂在第二行):

var groups = context.Groups.Include(x => x.Contacts);
foreach(var group in groups)
{
     foreach(var contact in group.Contacts)
     {
         contactsInGroup.Add(contact);
     }
}

同样的问题在这里(它挂在第四行):

var groups = context.Groups.ToList();
foreach(var group in groups)
{
     db.Entry(group).Collection(p => p.Contacts).Load(); 
     foreach(var contact in group.Contacts)
     {
         contactsInGroup.Add(contact);
     }
}

有人知道为什么吗?

实体框架非常慢

Include()Load()分别加载相关实体EagerLoadingLazyLoading

我认为在你的模型中添加索引可以提高你的性能

public class Group
{
 [Index("GroupIdIndex", 1)]
 public int GroupID { get; set; }
 public string Name { get; set; }
 public virtual ICollection<Contact> Contacts { get; set; }
}
public class Contact
{
 [Index("ContactIdIndex", 1)]
 public int ContactID { get; set; }
 public string FirstName { get; set; }
 public string LastName { get; set; }
 public virtual ICollection<Group> Groups { get; set; }
}