MVC как-то перечисляет результаты * после * оператора return? - PullRequest
2 голосов
/ 28 июня 2011

У меня есть код, который выглядит так:

 [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 запускается. Но улов для TimeoutException или Exception никогда не будет достигнут. Я подозреваю, что в работе MVC есть что-то, чего я не понимаю.

Особенность в том, что если я поставлю точку останова на return this.Json(custResults);, я могу без проблем пройти эту линию. Но если я добавлю ToList() на .Select(..), то будет выдано исключение TimeoutException. Как MVC может перечислить набор результатов после выполнения оператора return?

Ответы [ 2 ]

3 голосов
/ 28 июня 2011

Json, скорее всего, ленивый метод, поскольку он не перечисляет данный набор результатов.Вместо этого он оборачивает набор результатов в другом перечислителе.Это означает, что пока MVC не потребуются результаты, SQL никогда не выполняется.Учитывая, что ваши функции не выполняют перечисление, но MVC выполняет, это вызывает исключение, когда вы не можете заключить его в блок try / catch.

Как вы упомянули в своем посте, добавление ToList () вызоветперечисление набора и хранилища в местоположение, в результате чего исключение происходит там, где вы ожидаете.

0 голосов
/ 28 июня 2011

Вызов Select () создаст отложенное (ленивое) перечисление

http://msdn.microsoft.com/en-us/library/bb548891.aspx:

Этот метод реализован с использованием отложенного выполнения.Немедленное возвращаемое значение - это объект, в котором хранится вся информация, необходимая для выполнения действия.Запрос, представленный этим методом, не выполняется до тех пор, пока объект не будет перечислен путем непосредственного вызова его метода GetEnumerator или использования foreach в Visual C # или For Each в Visual Basic.

Doing ToList () или ToArray() создаст коллекцию без отсрочек

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...