gpt4 book ai didi

c# - SELECT Entity Framework 中的异常处理

转载 作者:太空宇宙 更新时间:2023-11-03 19:20:26 26 4
gpt4 key购买 nike

使用 Entity Framework 和 IEnumerables 的一个很好的特性是您不必担心何时从 DB 实际查询数据。您只需传递查询结果,当实际需要时,EF 会为您获取。然而,当涉及到在您的 SELECT 代码周围放置 try/catch 时,它就变成了一个问题,因为要准确地确定何时查询数据库并不容易。

我现在遇到间歇性的数据库超时,我想记录 EF 在它发生时使用的 SQL,但我遇到了上面刚刚描述的问题。我有什么方便的方法来处理这个问题吗?还是我看错了问题?

最佳答案

每当执行您预期可能会异常的功能代码块时,您都应该使用正确的 try/catch 错误处理(就像在这种情况下,每当您对 EF 数据上下文执行 lamba 表达式和/或 LINQ 查询时)。真正的问题是您为什么会收到超时。

我想恭敬地指出您上述陈述的一个潜在谬误,这可能会为诊断和修复超时提供一些帮助。 “......你不必担心何时从数据库中实际查询数据。”我建议在构建名义上复杂的 LINQ 查询的过程中,您实际上确实需要非常清楚数据库何时会受到攻击。在通过调用 ToList()、Distinct()、Count() 等将它们具体化之前,您将希望尽可能长时间地将 LINQ 查询保持为 IQueryable。

所以假设您正在查询一个百万行的表并且您正在通过潜在的标准进行解析,您应该等到最后才使用 ToList() 实现查询,因为这是生成 SQL 语句的点EF 将在数据库上执行:

using(var context = CreateEFContextFactory())
{
var x = (from d in context.MyBigTable select d);
if(!string.IsNullOrWhitespace(stringParam1))
x = (from d in x where x.Field1 == stringParam1 select d);
if(intParam2 > 0)
x = (from d in x where x.Field2 == intParam2 select d);

var listOfMyBigTableObjects = x.Distinct().ToList(); //point of sql execution
}

关于c# - SELECT Entity Framework 中的异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12753400/

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