我是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个员工,我们可能不需要所有记录。
答案 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。