我在使用 Entity Framework 和 Code First 时遇到了有趣的性能问题。
这里是我的实体结构:
一本书可以有多条评论。 每条评论与一本书关联。 一条评论可以有一个或多个回复。 一个回复与一条评论关联。
public class Book
{
public int BookId { get; set; }
// ...
public ICollection<Review> Reviews { get; set; }
}
public class Review
{
public int ReviewId { get; set; }
public int BookId { get; set; }
public Book Book { get; set; }
public ICollection<Comment> Comments { get; set; }
}
public class Comment
{
public int CommentId { get; set; }
public int ReviewId { get; set; }
public Review Review { get; set; }
}
我已经向数据库填入了大量的数据并添加了适当的索引。我试图使用以下查询检索具有10,000个评论的单个书籍:
var bookAndReviews = db.Books.Where(b => b.BookId == id)
.Include(b => b.Reviews)
.FirstOrDefault();
这本书有10,000个评论。执行此查询的性能约为4秒。通过SQL Profiler运行完全相同的查询实际上根本不需要时间。我使用了相同的查询、SqlDataAdapter和自定义对象来检索数据,用时少于500毫秒。使用ANTS性能分析器发现大部分时间都花费在做一些不同的事情上:
Equals方法被调用了5000万次。
请问是否有人知道为什么需要调用这个方法5000万次以及如何提高性能?
virtual
。我不确定这是否相关。 - Yuck