gpt4 book ai didi

c# - Entity Framework 计数效率

转载 作者:行者123 更新时间:2023-11-30 20:28:01 25 4
gpt4 key购买 nike

我从数据库中查询学校实体。然后,我试图通过这样做来获得那所学校的学生人数:

var school = context.schools.Where(s=>s.ID == 1).Single();
int cnt = school.students.Count();

但我看到发送到数据库的查询获取了该学校的所有学生记录,并且在应用服务器上完成了统计。

而以下只是从数据库中查询 COUNT(),因为它应该是这样的:

int cnt = context.students.Where(s=>s.schoolID == 1).Count();

为什么这两种方法之间存在如此大的差异?难道第一个查询不应该也使用 COUNT() 来提高效率吗?

注意:不查询学校实体不是一个选项,因为我正在使用它的一些字段。

最佳答案

查询在最后可能的时刻运行以使其尽可能高效 - 称为延迟加载 - 在您的第一个示例中您的 Single()调用强制数据提供者不像您希望的那样懒惰。

当您调用 Single() 时,您要的是整个 Student记录 - 所有学生记录列表中的第一个,因此必须运行查询 ( GET SchoolId, SchoolName, .... FROM SCHOOLS WHERE SchoolId = 1 ) 才能获取该数据。然后你调用Count() , 重播查询除了只选择 COUNT .

在您的第二个示例中,您调用了 Count()仅在 Where() 之后称呼。 Where()不会强制播放查询,因为您还没有访问任何数据,因此数据提供者可以聪明地只播放 GET COUNT - 在数据库求值后键入查询 Count() .

如何判断 LINQ 方法是否会“播放”您的查询?我记得的方式是,如果它返回 IQueryable<T>不会播放您的查询,它会播放任何其他内容。

关于c# - Entity Framework 计数效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47935544/

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