查询无任何返回结果。

6

我有一个简单的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. 我正在使用带有MVC5的Visual Studio 2013。

* 更新 I *

根据下面的建议,在我的连接字符串(Web.config)中添加了"Connection Timeout = 10"并在*.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
检查连接是否超时。我遇到了这个问题,原因是连接字符串有问题,导致返回控制需要一些时间。连接超时后会抛出异常。 - Mahesh
你的数据库上下文中是否指定了超时?我建议使用SQL Profiler来确保查询已经传递到数据库,并查看它是否提供了任何关于为什么无法返回(死锁??)的见解。 - Mr Moose
"Models.Currency curr = _db.Currencies.FirstOrDefault()" 这段代码执行正确吗?在我的情况下,数据库中有太多的项目,查询时间太长了。另外,你应该使用分析器对数据库进行分析,并检查查询是否正常运行。 - zchpit
你在尝试执行那行代码时遇到了异常吗?还是线程永远卡在了那一行? - Luaan
1个回答

4

在 Freenode 的 C# 频道上,suchiman 给了我一点帮助,揭示了问题所在:我应该看到异常冒泡,但实际上没有。他建议我像这样记录我的数据库输出:

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

显示了错误的内容:

在 EntityFramework.dll 中发生了 'System.NotSupportedException' 类型的第一次机会异常 在 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);

它有效!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接