查询永远不会返回

时间:2015-03-17 08:23:45

标签: c# sql-server linq entity-framework

我有一个简单的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!

P.S。我正在使用MVC5运行Visual Studio 2013

*更新I *

根据下面的建议,我在我的连接字符串(在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。

我还应该注意什么?

1 个答案:

答案 0 :(得分:2)

在freenode的c#频道,来自此类人员的一点帮助揭示了这个问题:我本应该看到一个例外泡沫,但事实并非如此。他建议我按如下方式记录我的数据库输出:

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

显示错误:

  

“System.NotSupportedException”类型的第一次机会异常   发生在EntityFramework.dll中   2015年3月17日下午3:56:43关闭连接-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);

它有效!