我想创建一个函数,根据从数据库中读取的一系列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。
我假设这样做是添加一些递归查询或其他东西,但我不确定。
在不破坏性能的情况下实现这一目标的正确方法是什么?
答案 0 :(得分:3)
在链接条件时是否评估每个陈述?
我认为将您的初始查询视为IQueryable意味着它只应该在您检索数据时进行评估(例如您的计数):
IQueryable<RootDomain> lookup = db.RootDomains;