我有一个简单的LINQ-to-EF查询,由于某种原因停止工作,我的意思是,一旦执行它,执行控制永远不会返回到下一行.我无法弄清楚为什么会这样.如果我使用LINQ-to-SQL在
LinqPad中运行相同的查询,它可以正常工作.这是查询:
Models.Currency curr = _db.Currencies.SingleOrDefault(x => x.ISO == p.Items[i].CurrType);
其中_db是我的实体容器引用,p.Items [i] .CurrType包含值“USD”
可能是什么问题呢?我可以使用什么样的诊断?
TIA – e!
附:我正在使用MVC5在Visual Studio 2013上运行
*更新我*
根据下面的建议,我在我的连接字符串(在Web.config中)和命令超时(在* .Context.cs中)添加了“连接超时= 10”,如下所示:
public partial class Entities : DbContext
{
public Entities()
: base("name=Entities")
{
((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 10;
}
查询仍然挂起(永远不会超时抛出异常)并且在查询挂起时我在数据库中有一个gander.我可以看到SQL发布的外观(或多或少)像:
select * from Currencies
应该立即返回,因为该表中只有100个小记录.发出查询的连接是休眠和等待命令,数据库中没有阻塞;有问题的spid执行了0 cpu / io.
还有什么我应该看的?
最佳答案 在freenode的c#频道,来自Suchiman的一点帮助揭示了这个问题:我应该看到一个异常泡沫,但我不是.他建议我像这样记录我的数据库输出:
_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 up.这是他的推理:
06001
事实证明,如果我重写这样的代码:
var item = p.Items[i];
var curr = _db.Currencies.SingleOrDefault(x => x.ISO == item.CurrType);
有用!