当我尝试访问我的db上下文时,我可以通过我的结果访问其他表:
MyEntities myEnt = new MyEntities();
var comments = myEnt.Comments.Where(x=>x.UserName == UserName);
foreach(Comment comment in comments){
string FirstName = comment.UserProfile.FirstName;
}
我的智能感知拉出外键映射,并允许我访问连接表UserProfile
。这是一个不好的做法,以"链"我的结果,而不是做一个标准的linq查询,像这样的连接:
var query = from comments in myEnt.Comments
join up in myEnt.UserProfiles on comments.UserId equals up.UserId
select new {...}
更新如果我进一步跟踪,如:
comment.aspnet_Users.UserProfiles.UserRatings.ToList()
我尝试了类似的东西,当我在第二次尝试这种方法时,查询似乎花费了更长的时间。智能感知允许您跟踪到相关的表,如果我像这样链接多个表,这对速度有影响吗?
我建议使用MiniProfiler
根据您的问题,底层提供程序有可能在循环期间导致N+1问题,这在ORM世界中被认为是一种不好的实践。
foreach(Comment comment in comments){
string FirstName = comment.UserProfile.FirstName;
}
你也可以在你的where语句中使用include来急切地在每个结果中加载UserProfiles:
var comments = myEnt.Comments.Where(x=>x.UserName == UserName);
like this:
var comments = myEnt.Comments.Include('UserProfile').Where(x=>x.UserName == UserName);
我认为只要访问扩展属性的代码保持在当前创建的上下文中,就不会有什么不同。当实体离开上下文并且代码进一步访问其中一个属性时,就会发生这种情况。如果它们这样做,并且上下文是关闭的,则最终会抛出错误。如果您的数据模型发生了变化,那么这两个示例都将在编译时抛出错误,因此我认为这是一个错误。