修改查找的性能很差

时间:2017-01-24 04:14:58

标签: c# entity-framework

我想创建一个函数,根据从数据库中读取的一系列bool值修改查找。

我尝试采用这样的方法:

IEnumerable<RootDomain> lookup = db.RootDomains;

//bools are nullable
if (conditions.HasCompanyMatch == true) lookup = lookup.Where(x => x.Companies.Any(c => c.CompanyMatches.Count > 1));
if (conditions.HasCompanyMatch == false) lookup = lookup.Where(x => !x.Companies.Any(c => c.CompanyMatches.Count > 1));
if (conditions.HasEmail == true) lookup = lookup.Where(x => x.EmailMessages.Count() > 1);
// etc.. more bool switches

//very slow when it enumerated in any way
var count = lookup.Count();

虽然有效,但速度非常慢。枚举可枚举的查找时,ram的使用率会上升到800mb左右,需要几分钟,而如果我一步完成,只需几秒钟,ram就像60mb。

我假设这样做是添加一些递归查询或其他东西,但我不确定。

在不破坏性能的情况下实现这一目标的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

在链接条件时是否评估每个陈述?

我认为将您的初始查询视为IQueryable意味着它只应该在您检索数据时进行评估(例如您的计数):

IQueryable<RootDomain> lookup = db.RootDomains;