链接我的实体结果的不良做法

本文关键字:不良 结果 我的 实体 链接 | 更新日期: 2023-09-27 17:50:22

当我尝试访问我的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);

我认为只要访问扩展属性的代码保持在当前创建的上下文中,就不会有什么不同。当实体离开上下文并且代码进一步访问其中一个属性时,就会发生这种情况。如果它们这样做,并且上下文是关闭的,则最终会抛出错误。如果您的数据模型发生了变化,那么这两个示例都将在编译时抛出错误,因此我认为这是一个错误。