LINQ и .COUNT тайм-аут - PullRequest
       35

LINQ и .COUNT тайм-аут

3 голосов
/ 06 апреля 2009

У меня есть общий вопрос и интерес к LINQ и тайм-аутам.

У меня есть работающее приложение, и я получаю тайм-ауты по следующему коду.

Следующий код, который является нормальным, и я не вижу ничего плохого:

приватный статический tblUser GetUserLinq (строка электронной почты, строка пароля) { DataContext db = new DataContext ();

        var tblUsers = from user in db.tblUsers
                           where user.EmailAddress == email
                           && user.Password == password
                           select user;

        if (tblUsers.Count() == 0)
            return null;

        return tblUsers.First();
    }

Но на следующие таймауты, довольно много, на:

        if (tblUsers.Count() == 0)

Вот исключение

Истекло время ожидания. Время ожидания истекло до завершения операции или сервер не отвечает. - System.Data.SqlClient.SqlException: истекло время ожидания. Время ожидания истекло до завершения операции или сервер не отвечает. в System.Data.SqlClient.SqlConnection.OnError (исключение SqlException, логическое breakConnection) в System.Data.SqlClient.SqlInternalConnection.OnError (исключение SqlException, логическое breakConnection) в System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning (TdsParserStateObject stateObj) в System.Data.SqlClient.TdsParser.Run (RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) в System.Data.SqlClient.SqlDataReader.ConsumeMetaData () в System.Data.SqlClient.SqlDataReader.get_MetaData () в System.Data.SqlClient.SqlCommand.FinishExecuteReader (SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) в System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior, RunBehavior runBehavior, логический returnStream, логический асинхронный) в System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, логический returnStream, метод String, результат DbAsyncResult) в System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, логический returnStream, метод String) в System.Data.SqlClient.SqlCommand.ExecuteReader (поведение CommandBehavior, метод String) в System.Data.SqlClient.SqlCommand.ExecuteDbDataReader (поведение CommandBehavior) в System.Data.Common.DbCommand.ExecuteReader () в System.Data.Linq.SqlClient.SqlProvider.Execute (запрос выражения, фабрика QueryInfo queryInfo, фабрика IObjectReaderFactory, Object [] parentArgs, Object [] userArgs, ICompiledSubQuery [] subQueries, Object lastResult) в System.Data.Linq.SqlClient.SqlProvider.ExecuteAll (запрос выражений, QueryInfo [] queryInfos, фабрика IObjectReaderFactory, Object [] userArguments, ICompiledSubQuery [] subQueries) в System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute (запрос выражения) в System.Data.Linq.DataQuery 1.System.Linq.IQueryProvider.Execute[S](Expression expression) at System.Linq.Queryable.Count[TSource](IQueryable 1 источник) в Actions.GetUserLinq (Строковая электронная почта, Строковый пароль) в C: \ Actions.cs: строка 104 при входе в систему (строка электронной почты, пароль строки) в C: \ Actions.cs: строка 33

Некоторые мои мысли о том, почему истекает время ожидания:

Счетчик должен подсчитать количество записей в этой таблице, а это не то, что мы ищем Если мы пытаемся выяснить, существует ли запись, следует ли использовать следующий код:

        var tblUsers = (from user in db.tblUsers
                           where user.EmailAddress == email
                           && user.Password == password
                           select user).FirstOrDefault(u => u.UserId <0) ;

В противном случае я немного запутался, почему LINQ истекает на счетчике

Еще одна вещь, которую я заметил, заключается в том, что если вы запускаете следующий SQL-код непосредственно на компьютере через SQL Enterprise Manager, он также истекает, что указывает на то, что это, возможно, проблема с блокировкой, однако единственное приложение, вызывающее эту таблицу, - LINQ

выберите количество (идентификатор пользователя) из tbluser

Комментарии приветствуются

Ответы [ 4 ]

3 голосов
/ 07 апреля 2009

В сторону, постарайтесь держаться подальше от такого рода паттернов:

  if (tblUsers.Count() == 0)
            return null;

Существует фантастический метод расширения, называемый Any (), который сгенерирует гораздо лучший SQL для вас:

if ( !tblUsers.Any())
    return null;
3 голосов
/ 06 апреля 2009

Вы должны проверить индексы вашей пользовательской таблицы. Возможно, поможет индекс имени пользователя / пароля.

3 голосов
/ 06 апреля 2009

Если время запроса истекло даже при использовании SQL Enterprise Manager, это должно быть первое, на что вы обращаетесь.

Полностью уберите LINQ из картинки - убедитесь, что ничто еще не обращается к базе данных, и посмотрите, не истек ли этот запрос по-прежнему. Запустите на нем профилировщик запросов.

Конечно, если вы просто хотите получить первого пользователя, вы должны переписать свой метод как:

private static tblUser GetUserLinq(string email, string password) 
{ 
    DataContext db = new DataContext();

    var tblUsers = from user in db.tblUsers
                       where user.EmailAddress == email
                       && user.Password == password
                       select user;

    return tblUsers.FirstOrDefault();
}

(Нет необходимости указывать здесь "u => u.UserId <0".) </p>

FirstOrDefault уже вернет null, если нет результатов, это должно быть хорошо.

Похоже, у вас больше проблем с базой данных. Адреса электронной почты и пароль правильно проиндексированы?

1 голос
/ 06 апреля 2009

тот факт, что время ожидания выполнения запроса локально, указывает на то, что вам нужны некоторые индексы для вашей таблицы. Если вы запустите запрос в студии управления с включенным «Планом выполнения», вы сможете увидеть, какие индексы необходимо создать.

Возможно, дело в том, что, поскольку запрос истекает, вы не получите план выполнения, поэтому вам придется использовать функцию «Оценить план выполнения». (Иконки для них выглядят как маленькие синие и зеленые прямоугольники, соединенные вместе)

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