C# Linq到实体DbQuery对象出现故障
我想知道是否有人能解释一下这里可能发生的事情。我使用的是C#,MVC和实体框架 因此,我运行以下两行代码:C# Linq到实体DbQuery对象出现故障,c#,linq,entity-framework,C#,Linq,Entity Framework,我想知道是否有人能解释一下这里可能发生的事情。我使用的是C#,MVC和实体框架 因此,我运行以下两行代码: var booboo = _context.AppItems.Where(ai => ai.id == 101); var sql = booboo.ToString(); 我有一些奇怪的行为。ToString()方法挂起,因此失败。实际上,booboodbquery对象的任何内容都不能正常工作。 我的AppItem实体在代码中遇到了类似的问题(AppItems可能是DbSet)。
var booboo = _context.AppItems.Where(ai => ai.id == 101);
var sql = booboo.ToString();
我有一些奇怪的行为。ToString()方法挂起,因此失败。实际上,booboodbquery对象的任何内容都不能正常工作。
我的AppItem实体在代码中遇到了类似的问题(AppItems可能是DbSet)。实体框架似乎无法为AppItem实体构造查询
编辑:
我没有足够的耐心!在离开它很长一段时间后,我确实得到了以下例外:
Message=内部错误:已达到expression services限制。请在查询中查找可能复杂的表达式,并尝试简化它们
有趣的是,这是一个Sql.Client异常,这是我没有预料到的
下面是AppItem类的外观:
public class AppItem : Domain.Item
{
public int? UserProfileId { get; set; }
public virtual UserProfile UpdatedByUser { get; set; }
[MaxLength(50)]
public String Type { get; set;}
public DateTime UpdatedDate { get; set;}
// flags
public virtual ICollection<ItemFlag> Flags { get; set; }
// actions
public virtual ICollection<ItemAction> Actions { get; set; }
// notes
public virtual ICollection<Note> Notes { get; set; }
}
这很好用;ToString()返回构造好的SQL,一切看起来都井然有序
这对我来说真的很奇怪,没有错误消息或任何东西,应用程序在尝试查询AppItems时只是挂起。该表存在于数据库中,但这并不重要,因为我们没有查询数据库,我们首先无法构造查询
提前感谢您的帮助。我假设您的查询将返回1项 添加
.FirstOrDefault()在查询的末尾使用code>只返回一个项(当前查询返回类型为AppItems的IQuerable)
实体框架在需要时才执行查询,因此在代码中,它将在调用.ToString()方法时执行查询
试试这个:
var booboo = _context.AppItems.Where(ai => ai.id == 101).FirstOrDefault();
if (booboo != null)
{
var sql = booboo.ToString();
//etc
}
我发现了问题所在。
我使用每个类型的表进行继承。由于AppItem是一个基本类型,因此它为查询它而生成的SQL查询非常庞大(本例中有几千行),并且会导致问题。
所以,基本上,在使用每个类型的表时,您需要避免查询具有多个继承自它们的类型的基类型。是的,我知道所有这些。如果我运行您发布的代码,应用程序将挂起在第一行。无论我运行什么查询,如果我尝试在任何DbQuery对象上运行任何方法,无论该方法是FirstOrDefault()还是ToString(),应用程序都会挂起。。你试过在它周围放一个试抓块吗?它似乎在悄无声息地运行…数据库也在本地服务器上吗?或者托管在其他地方?try-catch没有帮助,因为它是挂起的,不会产生任何异常。所以它只是卡在try块内的同一条线上。数据库位于同一房间中的单独服务器上。从开发机器访问数据库并对其运行sql查询没有问题。对AppItem表运行sql查询没有问题。数据库不可能成为问题,因为它还没有发展到那个程度。DbQuery对象甚至不能在不挂起的情况下生成SQL字符串。当我将其保留足够长的时间时,出现了一个异常。我编辑了原始问题,并将信息放在那里。
var booboo = _context.AppItems.Where(ai => ai.id == 101).FirstOrDefault();
if (booboo != null)
{
var sql = booboo.ToString();
//etc
}