如何在 LINQ 中急切加载整个 SQL 表?

Posted

技术标签:

【中文标题】如何在 LINQ 中急切加载整个 SQL 表?【英文标题】:How to Eager Load entire SQL table in LINQ? 【发布时间】:2009-01-16 16:27:44 【问题描述】:

编写我的第一个 Linq 应用程序,我正在尝试找到执行以下操作的最佳方法:

我想一次加载整个员工表以填充缓存(用于表单自动完成)。

我能做到-

var query = from employee in db.Employees select employee;
foreach (Employee e in query)

    ...

但由于这是延迟加载,它会为每位员工生成一个查询。我怎样才能急切地加载整个表?

我已经调查过DataLoadOptions,但这似乎只适用于人际关系。

【问题讨论】:

【参考方案1】:
var query = db.Employees.ToList();

顺便说一句,这相当于:

var query = (from employee in db.Employees select employee).ToList();

当 lambda 语法更有意义且更短时,没有理由强迫自己使用查询运算符语法。

旁注 1query 对象的类型将是 List<Employee>,但是,如果我们明确指定它,则生成的 IL 和性能方面没有区别。

旁注 2:重要的是要知道问题中指定的查询不是每个员工执行一次。它只执行一次,并从数据库中一一获取(类似于运行 SELECT * FROM Employees 查询的 SqlDataReader 对象)。但是,ToList() 会加载列表中的所有行,从而在应用程序本身而不是 SQL Server 上执行针对该对象的进一步查询。

【讨论】:

当您确切知道将要发生什么时,为什么还要使用“var”?你不能改用员工名单吗? 克里斯,这是一个主观的话题,也是一种宗教问题,在其他问题中已经讨论过了。发出的 IL 绝对没有差异(因此,性能)。这主要是风格问题。 在 C# 3.0 中仍然输入变量,它只是语法糖 一切取决于使用范围和您的喜好。这是关于利弊的好读物:***.com/questions/41479/use-of-var-keyword-in-c

以上是关于如何在 LINQ 中急切加载整个 SQL 表?的主要内容,如果未能解决你的问题,请参考以下文章

LINQ中的First()会导致急切或延迟加载吗?

Linq to Entities - 使用 Include() 急切加载

ORM(Linq-SQL EF)是不是从表中加载整个数据集?

在 NHibernate 3.0 Linq 中急切加载多个兄弟姐妹和孙辈(堂兄弟?)的良好行为

如何急切加载具有条件和当前用户的关联表?

Laravel 急切加载多个模型,它们都在同一个表中