我在论坛网站上使用 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/