2015-03-17 5 views
3

У меня есть простой запрос LINQ-to-EF, который по какой-то причине перестает работать, и я имею в виду, что как только он будет выполнен, управление выполнением никогда не будет возвращено в следующую строку. Я не могу понять, почему так может быть. если я запускаю тот же запрос в LinqPad, используя LINQ-to-SQL, он отлично работает. вот вопрос:Запрос никогда не возвращается

Models.Currency curr = _db.Currencies.SingleOrDefault(x => x.ISO == p.Items[i].CurrType); 

_db где моя сущность ссылка контейнер и p.Items[i].CurrType содержит значение «USD»

, что может быть проблема? какую диагностику я мог бы использовать?

TIA - e!

p.s. Я бегу на Visual Studio 2013 с MVC5

* обновление I *

согласно ниже предложения, я добавил как в "Connection Timeout = 10" к моей строке соединения (в Web.config) и время ожидание команды (в * .Context.cs), как это:

public partial class Entities : DbContext 
{ 
    public Entities() 
     : base("name=Entities") 
    { 
     ((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 10; 
    } 

в запросе еще виснет (никогда таймаут, чтобы бросить исключение), и я был глупец в базе данных в то время как запрос был повешен , Я могу видеть, что SQL выдается внешний вид (более или менее), как:

select * from Currencies 

, который должен вернуться сразу, так как есть только 100 маленьких записей в этой таблице. соединение, на которое выдается запрос, выполняет спящую и ожидающую команду, и в базе данных нет блокировки; spid в вопросе выполнил 0 cpu/io.

Что еще я должен смотреть?

+1

Проверьте, не истекает ли таймаут при подключении. Это случилось со мной, проблема заключалась в строке соединения, и именно поэтому потребовалось некоторое время, чтобы вернуть элемент управления. Это было исключение после таймаута соединения. –

+0

У вас есть тайм-аут, указанный в вашем контексте db? У меня возникнет соблазн взглянуть на SQL Profiler, чтобы убедиться, что ваш запрос делает это в базе данных и видит, дает ли он представление о том, почему он не возвращается (deadlock ??) –

+0

«Модели.Currency curr = _db.Currencies.FirstOrDefault() "выполнить правильно? В моем случае у меня было много элементов в db, и запрос длился достаточно долго. постскриптумвы должны профилировать базу данных с помощью профилировщика и проверить, какой запрос отправляется на db. – zchpit

ответ

2

небольшая помощь от такого лица на канале C# freenode показала проблему: я должен был видеть пузырь для исключения, но я не был. он рекомендовал мне войти мой вывод базы данных, как это:

_db.Database.Log = s => System.Diagnostics.Debug.WriteLine(s); 

что показал ошибку:

A first chance exception of type 'System.NotSupportedException' occurred in EntityFramework.dll Closed connection at 3/17/2015 3:56:43 PM -07:00

, из которого он умело выводил, что ссылка на p.Items[i].CurrType бездельничал LinQ вверх. вот его рассуждения:

[Suchiman] Items[i] is actually a method call 
[Suchiman] get_Items(i) 
[Suchiman] transformed by the compiler 
[Suchiman] when analyzing the expression tree, EF will realize 
[Suchiman] there's a method called get_Items(Int32) 
[Suchiman] but it doesn't have any clue how to translate this into SQL 
[Suchiman] thats why it throws NotSupportedException 

что подтверждается тем фактом, что, если я переписать код так:

var item = p.Items[i]; 
var curr = _db.Currencies.SingleOrDefault(x => x.ISO == item.CurrType); 

это работает!

Смежные вопросы