我有一个简单的数据库,我使用datacontext生成Linq2SQL类。在我的应用程序的一部分中,我想加载整个关系,以便获取子记录。在应用程序的另一部分,我将这种关系跨越模型和视图之间的边界,我想不通过整个事情,因为这组子对象很大。有没有办法让这些子类在一个部分导出并导出到另一个部分?不加载整个关系
我知道在datacontext中将child属性设置为False,但这是全局更改。
我有一个简单的数据库,我使用datacontext生成Linq2SQL类。在我的应用程序的一部分中,我想加载整个关系,以便获取子记录。在应用程序的另一部分,我将这种关系跨越模型和视图之间的边界,我想不通过整个事情,因为这组子对象很大。有没有办法让这些子类在一个部分导出并导出到另一个部分?不加载整个关系
我知道在datacontext中将child属性设置为False,但这是全局更改。
您可以使用数据上下文的DataLoadOptions设置来完成此操作。您的应用程序中可能会有某种构建器类。要以最快速度和最肮脏的解决方案,你可以做类似下面的...
public class SqlContextBuilder
{
public SqlContextBuilder(MyDataContext dataContext)
{
_dataContext = dataContext;
}
private readonly MyDataContext _dataContext;
public MyDataContext CreateEagerLoadingContext()
{
var options = new DataLoadOptions();
// set those options!
_dataContext.LoadOptions = options;
return _dataContext;
}
public MyDataContext CreateLazyLoadingContext()
{
// lazy loading happens by default
return _dataContext;
}
}
解决的办法之一是通过关系为IQuerable。这将确保关系在需要之前不会被执行。如果你循环关系,那么它会为每个孩子执行。
另一种技术可能是使用DTO对象来创建您想要传递的ViewModel。这意味着您的ViewModel可能与界面非常相似。
这并不妨碍加载数据,它只是延迟它,直到它被请求。当我将一组数据传回视图时,它会被请求并填写。 – stimms 2009-09-15 20:11:30
ORM将具有绑定(只要您使用相同的DBML)。如果你从不要求他们,那么孩子们的课程将永远不会被填补。因此,您有一个获取机会,其中子类在初始查询上填充,而另一个机会在其中加载延迟(或者可能从未加载)。 – 2009-09-15 21:27:43