我想知道何时使用tolist。在以下示例中,以下两个都不会导致错误。那么,使用哪种方式?
var employees = db.Employees.Include(e => e.Department);
return View(employees);
var employees = db.Employees.Include(e => e.Department);
return View(employees.ToList());
答案 0 :(得分:5)
似乎代码是ASP.Net MVC代码..给定return View(employees);
我还假设使用LinqToSQL或EntityFramework等技术从数据库中提取数据。
鉴于这两个假设,我建议使用后者。即.ToList()
原因是,如果对帐户进行延迟评估,如果您在没有employees
的情况下传递.ToList()
,则实质上是将查询传递给View,并且在呈现View时枚举查询时将执行该查询。视图呈现应该很快,并且不会被调用数据库阻止。
.ToList()
会避免这种情况,并强制在控制器中执行查询,而View将在内存中提供数据,以便快速呈现......
希望它能回答你的问题。
编辑:有一点需要注意......在某些情况下,例如在使用OData APIs with WebAPI
构建API时,您实际上想要返回查询而非物化列表。原因是,在将过滤的数据返回给调用者之前,您希望在该查询之上构建Framework。换句话说,在实际呈现视图(序列化数据 - 通常不是HTML)之前,框架会为您做更多的工作。
答案 1 :(得分:0)
执行第一行后,employees
集合将不会加载到内存中(延迟加载)。首次访问集合时会加载它。当您调用ToList()
时,将强制将集合加载到内存中。
用法基于内存限制和速度之间的权衡。从内存中访问比延迟加载更快。