gpt4 book ai didi

c# - 使用 Func<> 而不是 lambda 时超时

转载 作者:太空宇宙 更新时间:2023-11-03 17:41:51 25 4
gpt4 key购买 nike

给定:

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); 导致超时异常。注意 predicate = lambda 表达式

我怀疑后一种方法试图拉下所有记录,而这种情况在这么大的表中是不会发生的。

为什么会这样?

最佳答案

它的发生是因为谓词的类型,本来应该是这样的

Expression<Func<CV3Address, bool>>

如果谓词是一个表达式树(如上)并且Context.CV3Address是一个 IQueryable<CV3Address>然后 EF 可以将表达式树转换为 SQL 并直接从数据库中获取结果。

另一方面,如果谓词是 Func<CV3Address, bool> (委托(delegate);指向已编译代码的指针)则无法将其转换为 SQL。因此,LINQ 没有其他选项可以将您的存储库视为 IEnumerable<CV3Address>。 ,这是一个可以在内存中过滤的序列。这具有需要从数据库中提取所有记录以过滤它们的副作用。

如果您对谓词进行硬编码,那么编译器可以将其视为表达式树或委托(delegate),并且由于 Context.CV3Address 的类型它将其视为表达式树。

关于c# - 使用 Func<> 而不是 lambda 时超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18260812/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com