2011-03-08 77 views
2

我是LINQ to SQL的新手,因此这个问题。LINQ to SQL工作外键表行

默认情况下,如果我为一行查询,LINQ to SQL是否获取所有foriegn关键行?

如:

让我们说我有1> N的关系将3台

分公司-N>部门-N>员工 如果我查询一个品牌排

Branch b = (
    from b in brachDataContext.Branches 
    where b.id = id 
    select b).ToList(); 

这是否会提取与分支行相关的所有部门以及与这些部门相关的员工?

如果是这样,那将是一个巨大的对象。每个分支可能有10个部门,每个部门可能有1000个员工,我们可能不需要所有的记录。

回答

3

Linq 2 SQL默认使用延迟执行,这意味着如果您枚举该集合,则将提取您的部门。

但是,您可以控制是否应该通过设置context.LoadOptions财产,像这样

DataLoadOptions dlo = new DataLoadOptions(); 
dlo.LoadWith<Branch>(b => b.Departments); 
context.LoadOptions = dlo; 
... query ... 

检查this post了关于延迟执行的详细信息包含在初始查询。

还阅读了IEnumerable和IQuerable及其行为之间的区别。这是了解所有Linq提供商的关键。我的经验是,Linq 2 Sql适用于较小的项目和快速开发等。如果您有其他的任何其他的东西,请考虑转移到Entity Framework或NHibernate以获得更多功能完整的体验。

+0

他们没有加载的默认行为 – Pleun 2011-03-08 13:26:11

+0

所以在默认行为中,如果linq2sql只在我访问分支对象中的部门时(例如使用foreach)在数据库中执行查询,我是对的吗?同样,如果我使用foreach语句(branch.Departments中的部门d),这些相关部门行是在单个数据库调用中获取的吗? – maX 2011-03-08 13:27:39

+0

这取决于你做什么,但它经常发生,你会得到很多电话到数据库。在这些情况下,我建议使用分析器来查看生成的SQL。但是,如果您知道您将需要它们,最好使用LoadOptions – Pleun 2011-03-08 13:33:46

0

如果是这样,那将是一个巨大的对象。 每个分支可能有10个部门 和每个部门可能有1000 雇员,我们可能不需要所有的 记录。

Branch b = (  from b in brachDataContext.Branches  
        where b.id = id  
        select b).ToList(); 

你给会导致查询的代码中的代码行hit-获取所有数据并将其存储在存储器中,每次执行。这是因为你正在使用.ToList()

考虑IQueryable<T>IEnumerable<T> - 这将使用延迟加载(如果启用),应该只获得所需的数据。

您可能还想考虑使用SQL事件探查器来查看在数据库上运行查询的确切时间。

+0

'.Include(..)'是一个EF功能,对于Linq 2不存在SQL – 2011-03-08 13:17:46

+0

Opps my bad - 已删除。 – SimonGates 2011-03-08 13:22:43

0

没有linq-to-sql会延迟加载,除非您另有指定。

如果您还想加载详细信息,则可以在datacontext上使用Loadoptions。