c# - LINQ ToList().Take(10) vs Take(10).ToList() 哪个生成更高效的查询

标签 c# linq linq-to-sql

给定以下 LINQ 语句,哪个更有效?

一个:

public List<Log> GetLatestLogEntries()
{
    var logEntries = from entry in db.Logs
                 select entry;
    return logEntries.ToList().Take(10);
}

两个:

public List<Log> GetLatestLogEntries()
{
    var logEntries = from entry in db.Logs
                 select entry;
    return logEntries.Take(10).ToList();
}

我知道 .ToList() 会立即执行查询。

最佳答案

第一个版本甚至无法编译——因为 Take 的返回值是一个 IEnumerable<T> , 不是 List<T> .所以你需要它是:

public List<Log> GetLatestLogEntries()
{
    var logEntries = from entry in db.Logs
                 select entry;
    return logEntries.ToList().Take(10).ToList();
}

这将从数据库中获取所有数据并将其转换为列表,然后获取前 10 个条目,然后再次将其转换为列表。 p>

获取 Take(10)出现在数据库中(即第二种形式)对我来说当然看起来便宜很多......

请注意,没有 Queryable.ToList()方法 - 你最终会调用 Enumerable.ToList()这将获取所有条目。换句话说,调用 ToList 参与 SQL 翻译,而 Take

另请注意,此处使用查询表达式也没有多大意义。我会写成:

public List<Log> GetLatestLogEntries()
{
    return db.Log.Take(10).ToList();
}

请注意,您可能需要一个 OrderBy调用 - 否则它只会获取它找到的前 10 个条目,这些条目可能不是最新的...

关于c# - LINQ ToList().Take(10) vs Take(10).ToList() 哪个生成更高效的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4389879/

相关文章:

c# - 合并两个程序并使用 1 的输出作为另一个程序的输入

c# - 优化 DateTime.Now 的替代方案

c# - Linq - SelectMany 混淆

c# - 如何使用 LINQ 匹配两个相同的数据库表?

c# - Aspose 或电子表格设备

linq - 与 NHibernate 和 Oracle 的按位与

c# - MVC SelectList 中的 LINQ 查询结果作为值和文本 - 不起作用

c# - IQueryable 上的动态 "WHERE IN"(linq to SQL)

c# - LINQ 执行查询

c# - 如何将 `linq` 的结果返回到 DataTable?