我在论坛网站上使用实体框架,并有两个问题查询示例。
查询#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”的主题中创建一个列并按此排序主题。出于我的目的,我真的希望通过最后一个回复来完成排序,而不是通过关于主题的任意列来完成,我可以使用每个添加/删除的回复来更新。 但是,如果你们认为没有其他方法可以实现我的目标,我会考虑这条路线。
答案 0 :(得分:3)
您的第一个示例将使用一个数据库查询。是的,它在SQL中进行计数。
你的第二个将使用两个。一个用于int totalTopics = query.Count();
,另一个用于分页结果。
他们中的任何一个都不会在内存中进行限制等。
答案 1 :(得分:1)
查询将在数据库上执行,但对于第二个查询,我建议按顺序取出订单,因为它们对于计数操作不是必需的并且正在减慢它。