1

我刚刚注意到,在我的网站的一个页面上,我将一个 ViewModel 传递给我的视图页面,NHProf 给出了以下警告:

此语句从视图中执行,这可能导致性能不佳和/或行为脆弱。

然后链接到此页面: http: //nhprof.com/Learn/Alerts/QueriesFromViews

我的 ViewModel 仅包含 2 个属性:

public IEnumerable<Photo> Photos { get; set; }
public Photo SelectedPhoto { get; set; }

我将照片分配给我的控制器中的这个 ViewModel,如下所示:

PhotoViewModel myViewModel = new PhotoViewModel();
myViewModel.Photos = entity.Photos;

My View 显然继承了这种类型,并且除了输出一个标题(它使用SelectedPhoto对象)之外,它只是循环遍历每个Photos渲染的每个内容。

NHProf 将“问题”查询显示为它检索我在视图中循环浏览的照片集合的位置,尽管我没有明确告诉它关闭并从我的视图中获取这些记录 - 我已经通过Photos我的 ViewModel 属性中的这些记录。

我有其他页面不需要传递 ViewModel,我只需传递IEnumerable<Photo>给 View,然后渲染标记与我在问题视图中所做的完全相同,NHProf 没有给出警告(因为不应该有) 在那种情况下。

我在想它可能与延迟加载有关,并且因为我的集合是 ViewModel 的一部分,所以当我遍历PhotosViewModel 类型中的属性时,它会在那时获取这些记录吗?

有谁知道这里发生了什么?该网站功能完美,但 NHProf 只是看到它正在做一些不应该做的事情?!

4

2 回答 2

4

你还没有展示你的Photos集合是如何被填充的,但我认为它就像viewModel.Photos = entity.Photos. 如果这是正确的(或类似的),那么您只是将延迟加载的实体集合分配给您的视图模型。

有几种方法可以解决这个问题,但它们本质上都是相同的:您需要在填充视图模型之前触发集合的加载。最简单的方法是将 a.ToArray()或等效项粘贴到您分配的集合上;这将强制获取。

于 2010-12-17T13:06:11.840 回答
1

你说的对。它与延迟加载有关。尝试急切地加载照片。并检查他们的关系。也许他们有一些急切的加载,你不需要,或者你正试图在你的视图中使用关联的实体。

于 2010-12-17T12:37:29.197 回答