防止在linq查询中填充子表

时间:2009-11-24 22:38:28

标签: c# linq

道歉,如果这已在其他地方发布,但我似乎无法找到有关此事的任何信息。

我正在尝试使用LinqtoSql数据上下文加载对象。

我有一个PageTemplate表。两者之间存在关系:

Page.TemplateIdTemplate.TemplateID

数据上下文自动处理了PageTemplate类。

我的代码是:

public class PageRepository
{
    Table<Page> _table = (new HospoEngineDataContext()).GetTable<Page>();

    public IQueryable<Page> Pages
    {
        get { return _table; }
    }

    public Page GetPageByName(string name)
    {
        Page page = (from p in _table where p.Name == name select p).FirstOrDefault();

        return page;
    }
}

当我运行GetPageByName()时,它会填充返回的Page对象。

但是它似乎也加载了Page.Template子对象。

有什么方法可以阻止这种情况发生吗?

编辑: 我刚刚安装了SqlServerQueryVisualizer并创建了一个新查询,所以我可以通过将此代码添加到上面的类中来查看生成的sql:

public IQueryable<Page> Test()
    {
        var pages = (from p in _context.Pages where p.Name == "Home Page Name" select p);

        return pages;

    }

事实证明,生成的sql是:

{SELECT [t0].[PageId], [t0].[TemplateId], [t0].[Name], [t0].[Title], [t1].[TemplateId] AS [TemplateId2], [t1].[Name] AS [Name2], [t1].[TemplateFile]
FROM [dbo].[Pages] AS [t0]
INNER JOIN [dbo].[Templates] AS [t1] ON [t1].[TemplateId] = [t0].[TemplateId]
WHERE [t0].[Name] = @p0
}

似乎只是加载Pages表。

4 个答案:

答案 0 :(得分:4)

默认情况下,Linq-to-Sql使用延迟执行。这意味着Page.Template对象在您第一次访问它之前不会加载,尽管它看起来像是立即加载的。 This article很好地解释了这一点。请注意,如果您正在使用visual studio进行调试,那么当您在Template上打开Page属性时,它将在此时加载。

答案 1 :(得分:1)

我有理由确定(将数据库附加到数据库以确认)LINQtoSQL将按需填充对象。如果您不查询子对象,它将不会填充。

答案 2 :(得分:1)

突出显示Linq to Sql设计器表面中的模板成员,然后将属性DelayLoaded更改为true。您可以通过观察从SQL事件探查器执行的代码来验证它是否正常工作

答案 3 :(得分:1)

很有可能它不是。

当您检查该属性时,它肯定会被填充 - 无论是在代码中还是在调试器中(如果这是您正在做的事情)。

有一些属性可能导致它,但我会放弃我上面首先说的(将一个分析器附加到你的数据库)。

如果不是上述情况,请检查DelayLoaded属性&amp;还要确保datacontext的DataLoad选项没有明确地设置为eager load Template。