gpt4 book ai didi

c# - MVC 是否以某种方式在返回语句后*枚举结果?

转载 作者:行者123 更新时间:2023-11-30 22:37:30 25 4
gpt4 key购买 nike

我有这样的代码:

 [HttpPost]
public ActionResult CustomerSearch(string firstName ...
{
...
try
{
var results = from t in db.Customers...
var custResults = results.Select(c=> new string[] { ... });
return this.Json(custResults );
}
catch (TimeoutException exc1)
{
return this.Json(new {error = "Search failed (timeout)"});
}
catch (System.Exception exc)
{ ... }
}

我通过将 sql 调用的超时设置为较小的值(5 秒)来对此进行测试。异常肯定会发生,我可以在我的日志中看到它并且 protected override void OnException 事件正在触发。但是 TimeoutExceptionException 的捕获永远不会被命中。我怀疑我不了解 MVC 的工作原理。

奇怪的是,如果我在 return this.Json(custResults); 上放置断点,我可以毫无问题地通过该行。但是,如果我将 ToList() 放在 .Select(..) 上,则会抛出 TimeoutException。返回语句执行后,MVC 如何枚举结果集?

最佳答案

Json 可能是一种惰性方法,因为它不会枚举给定的结果集。相反,它将结果集包装在另一个枚举器中。这意味着在 MVC 需要结果之前,SQL 永远不会执行。鉴于您的函数不执行枚举但 MVC 执行枚举,这会导致异常发生在您无法将其包装在 try/catch block 中的地方。

正如您在帖子中提到的那样,添加 ToList() 会导致将集合和存储枚举到某个位置,从而导致异常发生在您期望的位置。

关于c# - MVC 是否以某种方式在返回语句后*枚举结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6498468/

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