1

当我尝试访问我的数据库上下文时,我可以通过我的结果访问其他表:

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()

我尝试了类似的方法,当我在第二次尝试这种方法时,查询似乎花费了更长的时间。智能感知让您可以跟踪相关表格,如果我像这样链接多个表格,这会影响速度吗?

4

2 回答 2

4

我建议研究MiniProfiler

根据您的问题,底层提供者有可能在循环期间导致N+1问题,这在 ORM 世界中被认为是一种不好的做法。

foreach(Comment comment in comments){ string FirstName = comment.UserProfile.FirstName; }

您还可以在执行 where 语句时使用包含在每个结果中急切地加载 UserProfiles:

var comments = myEnt.Comments.Where(x=>x.UserName == UserName);像这样:

var comments = myEnt.Comments.Include('UserProfile').Where(x=>x.UserName == UserName);

于 2013-01-02T19:41:28.903 回答
0

只要访问扩展属性的代码保持在当前创建的上下文中,我认为这不会有什么不同。当实体离开上下文并且代码进一步访问这些属性之一时。如果他们这样做了,并且上下文已关闭,则最终将引发错误。如果你的数据模型会改变,这两个例子都会在编译时抛出错误,所以我认为这是一个洗牌。

于 2013-01-02T19:10:28.937 回答