C# 列出而不列出

C# 列出而不列出,c#,linq,C#,Linq,我想知道什么时候使用tolist。在下面的示例中,以下两项都不会导致错误。那么,使用哪种方法呢 var employees = db.Employees.Include(e => e.Department); return View(employees); var employees = db.Employees.Include(e => e.Department); return View(employees.ToList())

我想知道什么时候使用tolist。在下面的示例中,以下两项都不会导致错误。那么,使用哪种方法呢

 var employees = db.Employees.Include(e => e.Department);
            return View(employees);

 var employees = db.Employees.Include(e => e.Department);
            return View(employees.ToList());

看起来代码是ASP.NETMVC代码。。给定<代码>返回视图(员工) 我还假设数据是使用某种LinqToSQL或EntityFramework之类的技术从数据库中提取的

鉴于这两个假设,我建议使用后者。i、 e.使用
.ToList()
原因是,如果查询是延迟计算的,如果您传递
employees
而不传递
.ToList()
,则实际上是将查询传递给视图,并且在呈现视图时枚举查询时执行查询。视图渲染应该是快速的,并且不会被数据库调用阻止。
.ToList()
将避免这种情况,并强制在控制器中执行查询,视图将在内存中提供数据,以便快速渲染

希望它能回答你的问题


编辑:一个警告。。在某些情况下,例如在构建API时,例如在使用带有WebAPI的OData API时,您实际上希望返回查询而不是具体化列表。原因在于,在将过滤后的数据返回给调用方之前,通过设计,您希望框架构建在该查询之上。换句话说,在视图(序列化数据-通常不是HTML)实际呈现之前,框架会为您做更多的工作。

代码似乎是ASP.Net MVC代码。。给定<代码>返回视图(员工) 我还假设数据是使用某种LinqToSQL或EntityFramework之类的技术从数据库中提取的

鉴于这两个假设,我建议使用后者。i、 e.使用
.ToList()
原因是,如果查询是延迟计算的,如果您传递
employees
而不传递
.ToList()
,则实际上是将查询传递给视图,并且在呈现视图时枚举查询时执行查询。视图渲染应该是快速的,并且不会被数据库调用阻止。
.ToList()
将避免这种情况,并强制在控制器中执行查询,视图将在内存中提供数据,以便快速渲染

希望它能回答你的问题


编辑:一个警告。。在某些情况下,例如在构建API时,例如在使用带有WebAPI的OData API时,您实际上希望返回查询而不是具体化列表。原因在于,在将过滤后的数据返回给调用方之前,通过设计,您希望框架构建在该查询之上。换句话说,在视图(序列化数据-通常不是HTML)实际呈现之前,框架会为您做更多的腿部工作。

在执行第一行之后,
employees
集合将不会加载到内存中(延迟加载)。它是在首次访问集合时加载的。当您调用
ToList()
时,集合将被强制加载到内存中


使用率取决于内存限制和速度之间的权衡。从内存访问要比延迟加载快。

在执行第一行后,
employees
集合将不会加载到内存中(延迟加载)。它是在首次访问集合时加载的。当您调用
ToList()
时,集合将被强制加载到内存中


使用率取决于内存限制和速度之间的权衡。从内存访问要比延迟加载快。

听起来好像你没有处理DbContext。不要。示例决策指南-阅读MSDN听起来您没有处理DbContext。不要。示例决策指南-阅读MSDN,这样我们就可以得出结论:需要延迟加载=>不需要列表,不需要延迟加载=>tolist?否。当包含db访问的方法返回时,应该完全执行db访问。当您将IQueryable放入视图中时,应该会发生异常,因为db上下文已被关闭并释放。其他一切都非常糟糕。想象一下,必须调试一个奇怪的错误,该错误源于数据访问层,但发生在视图引擎中。因此,我们可以得出结论:需要延迟加载=>无需列出,无需延迟加载=>tolist?不。当包含db访问的方法返回时,应该完全执行db访问。当您将IQueryable放入视图中时,应该会发生异常,因为db上下文已被关闭并释放。其他一切都非常糟糕。想象一下,必须调试一个奇怪的错误,该错误起源于数据访问层,但发生在视图引擎中。