道歉,如果这已在其他地方发布,但我似乎无法找到有关此事的任何信息。
我正在尝试使用LinqtoSql数据上下文加载对象。
我有一个Page
和Template
表。两者之间存在关系:
Page.TemplateId
至Template.TemplateID
数据上下文自动处理了Page
和Template
类。
我的代码是:
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
表。
答案 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。