gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:45:38 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com