我对我的个人资料页面使用以下LINQ查询:
var userData = from u in db.Users
.Include("UserSkills.Skill")
.Include("UserIdeas.IdeaThings")
.Include("UserInterests.Interest")
.Include("UserMessengers.Messenger")
.Include("UserFriends.User.UserSkills.Skill")
.Include("UserFriends1.User1.UserSkills.Skill")
.Include("UserFriends.User.UserIdeas")
.Include("UserFriends1.User1.UserIdeas")
where u.UserId == userId
select u;
它有一个很长的对象图,并使用了许多包含。它现在运行得很完美,但是当网站有很多用户时,它会对性能产生很大影响吗?
我应该用其他方式来做吗?
发布于 2011-04-02 16:42:10
是的会的。如果Include在主表表行上展开了多个详细信息行,请避免使用Include。
我相信EF会将查询转换为一个大连接,而不是几个查询。因此,您最终将在details表的每一行上复制主表数据。
例如: Master -> Details。假设master有100行,Details有5000行(每个master有50行)。
如果延迟加载详细信息,则返回100行(size: master) + 5000行(size: details)。
如果使用.Include("Details"),则返回5000行(大小: master + details)。基本上,主部分被复制超过50次。
如果包含多个表,则会向上乘以。
检查EF生成的SQL。
发布于 2011-04-02 15:11:23
我建议您执行负载测试并测量站点在压力下的性能。如果您对每个请求执行复杂的查询,则可以考虑缓存一些结果。
https://stackoverflow.com/questions/5521749
复制相似问题