Linq to sql LINQ到SQL工作外键表行

Linq to sql LINQ到SQL工作外键表行,linq-to-sql,Linq To Sql,我不熟悉LINQ到SQL,因此提出了这个问题 默认情况下,如果我查询一行,linqtosql是否会获取所有外键行 例如: 让我们假设我有1->N个关系将有3个表 分行-N>部门-N>员工 如果我查询品牌行 Branch b = ( from b in brachDataContext.Branches where b.id = id select b).ToList(); 这是否包含与分行行相关的所有部门以及与这些部门相关的员工 如果是这样,那不是一个巨大的物体吗。

我不熟悉LINQ到SQL,因此提出了这个问题

默认情况下,如果我查询一行,linqtosql是否会获取所有外键行

例如:

让我们假设我有1->N个关系将有3个表

分行-N>部门-N>员工 如果我查询品牌行

Branch b = (
    from b in brachDataContext.Branches 
    where b.id = id 
    select b).ToList();
这是否包含与分行行相关的所有部门以及与这些部门相关的员工

如果是这样,那不是一个巨大的物体吗。每个分支机构可能有10个部门,每个部门可能有1000名员工,我们可能不需要所有记录

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

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

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


您可能还想考虑使用SQL剖析器来确切地查看数据库上运行查询的时间。

< P>没有LINQ到SQL,除非您另外指定,否则懒惰加载。


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

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

但是,您可以通过如下设置
context.LoadOptions
属性来控制它们是否应包含在初始查询中

DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<Branch>(b => b.Departments);
context.LoadOptions = dlo;
... query ...
DataLoadOptions dlo=newdataloadoptions();
dlo.LoadWith(b=>b.Departments);
context.LoadOptions=dlo;
... 查询
查看更多关于延迟执行的信息

同时阅读IEnumerable和iquierable之间的区别及其行为。这是了解所有Linq提供程序的关键


作为一个总结,我的经验是LINQ 2 SQL为更小的项目和快速的开发工作。如果你有任何其他的想法,考虑移动到实体框架或NHiBernt以获得更完整的功能体验。

<代码>。是EF功能,Linq 2 SQL不存在。在默认行为中,它们不会加载。因此,在默认行为中,如果linq2sql仅在我访问分支对象中的部门(如使用foreach)时才在数据库中执行查询,对吗?同样,如果我使用这个语句foreach(branch.Departments中的Department d),这些相关的Department行是在一个数据库调用中获取的吗?这取决于您所做的事情,但是经常会有很多对数据库的调用。在这些情况下,我建议使用探查器查看生成的SQL。但是,如果您知道您无论如何都会需要它们,那么最好使用加载选项谢谢您提供的信息。有什么好的链接可以让我了解更多关于linq2sql内部工作的信息吗?它们最初不是加载的,而是在您迭代依赖集合时加载的。因此,延期执行一词。正如Pleun所指出的,这通常是非常糟糕的,因为每次迭代都会有一个查询。
DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<Branch>(b => b.Departments);
context.LoadOptions = dlo;
... query ...