首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在字段上使用过滤器的实体框架计数非常慢-大计数

在字段上使用过滤器的实体框架计数非常慢-大计数
EN

Stack Overflow用户
提问于 2018-05-26 19:07:17
回答 1查看 1.3K关注 0票数 0

当我运行一个模型映射时,一家公司有很多成员,比如405,000名成员。

代码语言:javascript
运行
复制
viewModel.EmployeeCount = company.MembershipUser.Count(x => x.Deleted == false);

当我运行SQL查询时,需要几毫秒。在ASP.NET MVC中,EF6 C#最多需要10分钟才能命中一个列表视图控制器。有什么想法?

公司是Model实体,MembershipUser是一个使用实体框架6的公共虚拟虚拟(FK),而不是C#6

当我在我的CompanyController (MVC),我要求一个公司名单,我得到一个列表,没有公司计数包括在内。当我对我的模型执行viewModelMapping以准备传递到视图时,我需要添加计数,并且不能访问上下文或DB等等。

代码语言:javascript
运行
复制
            // Redisplay list of companies
            var viewModel = CrmViewModelMapping.CompanyListToCompanyViewModel(pagedCompanyList);

CompanyListToCompanyViewModel将公司列表映射到我的ViewModel列表中,并在那里进行计数(MembershipUsers)。

我还尝试将count属性添加到公司DomainModel中,例如:

代码语言:javascript
运行
复制
public int EmployeeCount
    {
        get
        {
            // return MembershipUser.Where(x => x.Deleted == false).Count();
            return MembershipUser.Count(x => x.Deleted == false);
        }
    }

但对于拥有大量员工的公司来说,这也需要很长时间。

就像我希望这是我的SQL查询一样:

代码语言:javascript
运行
复制
Select *, (SELECT count(EmployeeID) as Count WHERE Employee.CompanyID = CompanyID) as employeeCount from Company

但在一开始,我就以为我可以让EF懒散的加载和subQueries来完成这项工作。但巨额开销让我丧命。在小的数据集中,我没有看到真正的区别,但一旦计数变大,我的网站是无法保证的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-26 23:11:03

当您访问导航属性并使用count方法时,您正在物化所有MembershipUser表并在C#中执行筛选。

该命令中有三个操作: C#转到数据库并执行查询,转换C#对象列表中的查询结果(物化),并执行此列表中的筛选器(x => x.Deleted == false)。

要解决这个问题,可以在MembershipUser DbSet中执行筛选:

代码语言:javascript
运行
复制
Db.MembershipUser.Count(x => x.Deleted == false && companyId == company.Id);

使用DbSet执行查询时,过滤器将在数据库中完成,而不会将所有405000行物化。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50546192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档