当我运行一个模型映射时,一家公司有很多成员,比如405,000名成员。
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等等。
// Redisplay list of companies
var viewModel = CrmViewModelMapping.CompanyListToCompanyViewModel(pagedCompanyList);CompanyListToCompanyViewModel将公司列表映射到我的ViewModel列表中,并在那里进行计数(MembershipUsers)。
我还尝试将count属性添加到公司DomainModel中,例如:
public int EmployeeCount
{
get
{
// return MembershipUser.Where(x => x.Deleted == false).Count();
return MembershipUser.Count(x => x.Deleted == false);
}
}但对于拥有大量员工的公司来说,这也需要很长时间。
就像我希望这是我的SQL查询一样:
Select *, (SELECT count(EmployeeID) as Count WHERE Employee.CompanyID = CompanyID) as employeeCount from Company但在一开始,我就以为我可以让EF懒散的加载和subQueries来完成这项工作。但巨额开销让我丧命。在小的数据集中,我没有看到真正的区别,但一旦计数变大,我的网站是无法保证的。
发布于 2018-05-26 23:11:03
当您访问导航属性并使用count方法时,您正在物化所有MembershipUser表并在C#中执行筛选。
该命令中有三个操作: C#转到数据库并执行查询,转换C#对象列表中的查询结果(物化),并执行此列表中的筛选器(x => x.Deleted == false)。
要解决这个问题,可以在MembershipUser DbSet中执行筛选:
Db.MembershipUser.Count(x => x.Deleted == false && companyId == company.Id);使用DbSet执行查询时,过滤器将在数据库中完成,而不会将所有405000行物化。
https://stackoverflow.com/questions/50546192
复制相似问题