LINQ to SQL工作外键表行

时间:2011-03-08 13:03:47

标签: 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 个答案:

答案 0 :(得分:3)

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

但是,您可以通过设置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以获得更多功能完整的经验。

答案 1 :(得分:0)

  

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

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

您提供的代码将导致每次执行该行代码时执行查询 - 获取所有数据并将其存储在内存中。这是因为你正在使用.ToList()

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

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

答案 2 :(得分:0)

除非另有说明,否则没有linq-to-sql进行延迟加载。

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