我想在视图模型的属性中传递EF实体,但我担心它可能会导致性能问题,因为DB记录的一些列值很大。然后我意识到,除非我访问那些特定的字段,否则我不会因为延迟加载而遭受惩罚。这是正确的吗?
为了详细说明,在下面的例子中,book属性可能被称为ABSTRACT,这是一个字符串,在DB中是VARCHAR(MAX)。它也可以有ID, AUTHOR和TITLE:
public class vmTest
{
public Book MyBook { get; set; }
}
如果我只希望访问ID和TITLE,那么如果我的理论是正确的,那么ABSTRACT列将不会加载到RAM中,因此不会导致性能问题。
提前感谢您的帮助
据我所知,当您请求MyBook时,将从数据库中加载所有整型和字符串。延迟加载只适用于被引用的实体。
这实际上是ViewModel的理想情况。创建ViewModel并仅用您需要的数据加载它。在controller中:
var toView = context.Books.Select(e => new YourViewModel { BookID = e.ID, Title = e.Title}).SingleOrDefault(vm => YourFilter(vm));
public class YourViewModel
{
public int BookID { get; set;}
public string Title { get; set;}
}
这样做,您只加载您需要的数据,因为select语句将在db中进行适当的投影。