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

Man*_*ani 8 c# linq linq-to-sql

鉴于以下LINQ声明,哪个更有效?

一:

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

二:

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

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

Jon*_*eet 20

第一个版本甚至不会编译 - 因为返回值Take是a IEnumerable<T>,而不是a List<T>.所以你需要它:

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

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

获取Take(10)数据库中发生(即第二种形式)当然看起来很多赫克便宜,我...

请注意,没有Queryable.ToList()方法 - 您将最终调用Enumerable.ToList()哪个将获取所有条目.换句话说,调用ToList 参与SQL翻译,而Take确实如此.

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

public List<Log> GetLatestLogEntries()
{
    return db.Log.Take(10).ToList();
}
Run Code Online (Sandbox Code Playgroud)

请注意,你可能想要一个OrderBy电话 - 否则它只需要找到它找到的前10个条目,这可能不是最新的......