实体框架非常慢
本文关键字:非常 框架 实体 | 更新日期: 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()分别加载相关实体EagerLoading或LazyLoading。
我认为在你的模型中添加索引可以提高你的性能
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; }
}