鉴于:
public EntityAddress ReadSingle(Func<EntityAddress, bool> predicate)
{
//var result = Context.CV3Address.FirstOrDefault(a => a.GUID == 1100222);
var result = Context.CV3Address.FirstOrDefault(predicate);
return result;
}
FirstOrDefault(a => a.GUID == 1100222);
立即返回结果。FirstOrDefault(predicate);
导致超时异常。注意谓词= lambda表达式我的怀疑是,后一种方法试图拉低所有记录,而这种记录不会在如此大的表中发生。
为什么会这样?
最佳答案
发生这种情况的原因是谓词的类型,而应改为
Expression<Func<CV3Address, bool>>
如果谓词是表达式树(如上所述),而
Context.CV3Address
是IQueryable<CV3Address>
,则EF可以将表达式树转换为SQL,并直接从数据库中获取结果。另一方面,如果谓词是
Func<CV3Address, bool>
(委托;指向已编译代码的指针),则不能将其转换为SQL。因此,LINQ没有其他选择可以将存储库视为IEnumerable<CV3Address>
,这是可以在内存中过滤的序列。这具有需要从数据库中提取所有记录以对其进行过滤的副作用。如果对谓词进行硬编码,则编译器可以将其视为表达式树或委托,并且由于
Context.CV3Address
的类型,因此会将其视为表达式树。