我遇到了一个有趣的实体框架性能问题。我使用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毫秒以下。
使用蚂蚁性能分析器,它看起来像一大块的时间被消耗在做一些不同的事情:
equals方法被调用5000万次。
有谁知道为什么它需要调用这5000万次,我怎样才能提高性能呢?
您是否确实看到您的语句正在生成哪个查询,或者您认为它是最佳查询? –
试试EF Profiler。 –
问题不在于我说过的查询。我使用EF生成的确切查询,并使用常规ADO.net在Sql Data Adapter中使用它,手动加载相同的对象。它运行时间不到一秒钟。 – Dismissile