【发布时间】:2009-04-06 07:04:03
【问题描述】:
我有一个一般性问题,并对 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;
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,字符串 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 行为,字符串方法)
在 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.DataQuery1.System.Linq.IQueryProvider.Execute[S](Expression expression)
at System.Linq.Queryable.Count[TSource](IQueryable1 来源)
在 C:\Actions.cs:line 104 中的 Actions.GetUserLinq(String email, String password)
在 C:\Actions.cs:line 33 中的登录(字符串电子邮件,字符串密码)处
我对为什么超时的一些想法:
count需要统计那个表的记录数,这不是我们要的 如果我们试图查找记录是否存在,那么我们应该使用以下代码:
var tblUsers = (from user in db.tblUsers
where user.EmailAddress == email
&& user.Password == password
select user).FirstOrDefault(u => u.UserId <0) ;
否则我有点困惑为什么 LINQ 会超时
我注意到的另一件事是,如果您通过 SQL 企业管理器直接在机器上运行以下 SQL,它也会超时,这表明它可能是一个锁定问题,但是调用该表的唯一应用程序是 LINQ
从 tbluser 中选择计数(用户 ID)
欢迎评论
【问题讨论】:
-
您是否以纯文本形式存储密码?我建议使用 SHA1 哈希或更好的盐渍哈希。
-
是的,我同意,但这不是这里的问题
标签: .net linq linq-to-sql exception