此查询是在内存中集合中执行还是在数据库中执行?

时间:2011-02-15 17:59:02

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

我在论坛网站上使用实体框架,并有两个问题查询示例。

查询#1)此查询应该获取论坛中所有主题的主题计数。它是否在SQL中执行计数以便我只返回一个数字?或者是将所有主题都拉入内存然后计算集合中的主题?

            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”的主题中创建一个列并按此排序主题。出于我的目的,我真的希望通过最后一个回复来完成排序,而不是通过关于主题的任意列来完成,我可以使用每个添加/删除的回复来更新。 但是,如果你们认为没有其他方法可以实现我的目标,我会考虑这条路线。

2 个答案:

答案 0 :(得分:3)

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

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

他们中的任何一个都不会在内存中进行限制等。

答案 1 :(得分:1)

查询将在数据库上执行,但对于第二个查询,我建议按顺序取出订单,因为它们对于计数操作不是必需的并且正在减慢它。