c# - 这个查询是在内存中的集合上执行的,还是在数据库中执行的?

标签 c# linq entity-framework entity-framework-4 linq-to-entities

我在论坛网站上使用 Entity Framework ,有两个带问题的查询示例。

查询 #1) 此查询应该获取论坛中所有主题的主题计数。它是否在 SQL 中执行计数以便我只得到一个数字?还是把所有topic拉入内存,然后统计集合中的topic?

            return DBContext.Topics
                .Where(x => !x.ModsOnly)
                .Where(x => !x.Board.ModsOnly)
                .Where(x => !x.Board.Hidden)
                .Count();

查询 #2) 该查询应该获取所有主题,并按最后回复日期(如果没有回复,则按主题日期)排序。然后它对结果进行计数,并对结果进行分页。这个查询有多少是在数据库中执行的?此查询需要 FOREVER,所以我认为它会在某个时候将所有主题拉入内存,可能在分页生效之前。

            var query = DBContext.Topics
                    .Where(x => !x.ModsOnly)
                    .Where(x => !x.Board.ModsOnly)
                    .Where(x => !x.Board.Hidden)
                    .OrderByDescending(x => x.GlobalSticky)
                    .ThenByDescending(x => x.Replies
                        .Where(r => !r.ModsOnly)
                        .Any() ? x.Replies
                            .Where(r => !r.ModsOnly)
                            .Max(r => r.PostedDate) : x.PostedDate);
                int totalTopics = query.Count();
                if (totalTopics > itemsPerPage)
                    return query.Skip((page - 1) * itemsPerPage).Take(itemsPerPage);
                else
                    return query;

我不是 LINQ 大师,因此不胜感激。我知道这是一个复杂的查询,但如果有人能花点时间解析它并弄清楚哪里/如果我哪里出错了,那将非常有帮助。

注意:我试图避免在名为“LastReplyDate”的主题中创建一个列并以此为主题排序。出于我的目的,我真的希望按最后一个回复进行排序,而不是按主题的任意列进行排序,我可能必须根据每个添加/删除的回复进行更新。 但是,如果你们认为没有其他方法可以实现我的目标,我会考虑这条路线。

最佳答案

您的第一个示例将使用一个数据库查询。是的,它在 SQL 中进行计数。

您的第二个将使用两个。一个用于 int totalTopics = query.Count();,一个用于分页结果。

两者都不会在内存中做限制等。

关于c# - 这个查询是在内存中的集合上执行的,还是在数据库中执行的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5007500/

相关文章:

c# - Linq to Sql - 具有多个连接的不同项目的查询列表

c# - 限制查询以忽略元素后代

c# - 如何使用 Automapper 来展平实体层次结构列表?

c# - 在 MySql 的 EntityFramework 中设置提供程序和连接字符串

c# - 如何在 Windows Phone 运行时获取 StorageFolder 中的所有文件?

c# - 您可以 [过时] Razor 中的 DisplayTemplate 吗?

c# - 如何使用 HttpContentExtensions.ReadAsAsync<T>()?

c# - 从屏幕继承的单元测试 View 模型 (Caliburn.Micro)

c# - Linq 返回一个字段或另一个

c# - 如何从 DBEntityEntry 获取外键值?