不加载整个关系

时间:2009-09-15 19:31:41

标签: asp.net-mvc linq-to-sql

我有一个简单的数据库,我使用datacontext从中生成Linq2SQL类。在我的应用程序的一部分中,我想加载整个关系,以便我获得子记录。在应用程序的另一部分中,我将该关系传递到模型和视图之间的边界,并且我不想传递整个事物,因为子集的范围非常大。有没有办法不将这些子类导出到一个部分并导出到另一个部分?

我知道在datacontext中将child属性设置为False,但这是一个全局更改。

2 个答案:

答案 0 :(得分:1)

您可以使用数据上下文中的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;
    }
}

答案 1 :(得分:0)

其中一个解决方案是将关系作为IQuerable传递。这将确保在需要之前不执行关系。如果你循环关系,那么它将为每个孩子执行。

另一种技术可能是使用DTO对象来创建您想要传递的ViewModel。这意味着您的ViewModel可能与界面非常相似。