gpt4 book ai didi

c# - 查询永不返回

转载 作者:太空狗 更新时间:2023-10-29 23:38:24 24 4
gpt4 key购买 nike

我有一个简单的 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 中)添加了一个“Connection Timeout=10”,如下所示:

public partial class Entities : DbContext
{
public Entities()
: base("name=Entities")
{
((IObjectContextAdapter)this).ObjectContext.CommandTimeout = 10;
}

查询仍然挂起(永远不会超时抛出异常)并且在查询挂起时我查看了数据库。我可以看到发出的 SQL 看起来(或多或少)像:

select * from Currencies

应该立即返回,因为该表中只有 100 条小记录。发出查询的连接正在休眠并等待命令,并且数据库中没有阻塞;有问题的 spid 执行 0 cpu/io。

我还应该看什么?

最佳答案

suchiman 在 freenode 的 c# channel 的一点帮助揭示了这个问题:我应该看到异常冒泡,但我没有。他建议我像这样记录我的数据库输出:

_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。这是他的推理:

[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);

它有效!

关于c# - 查询永不返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29094288/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com