我想知道是否有人可以阐明这里可能发生的事情。我正在使用带有实体框架的C#,MVC。
所以我运行这两行代码:
var booboo = _context.AppItems.Where(ai => ai.id == 101);
var sql = booboo.ToString();
而且我得到一些奇怪的行为。 booboo.ToString()方法挂起,因此失败。实际上,有关booboo DbQuery对象的任何操作均不起作用。
我的AppItem实体在代码中都遇到类似的问题(您可能会猜到AppItems是DbSet)。实体框架似乎无法构造AppItem实体的查询。
编辑:
我不够耐心!放置很长时间后,确实出现以下异常:
“消息=内部错误:已达到表达式服务限制。请在查询中查找可能复杂的表达式,并尝试简化它们。”
有趣的是,这是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; }
}
域项包含一个主键字段(id)和其他一些字段。
这里的Note / ItemAction / ItemFlag类都继承自AppItem,所以也许应该归咎于某种循环引用吗?
可以查询其他项目。例如,我有许多从AppItem继承的类(例如ItemFlag,ItemAction和Note),我可以查询所有这些。
因此,在Member为DbSet且Member继承自AppItem的情况下:
var foofoo = _context.Members.Where(ai => ai.id = 101);
var sql = foofoo.ToString();
这很好; foofoo.ToString()返回构造的SQL,并且一切看起来都井然有序。
在我看来,这真的很奇怪,没有错误消息或任何内容,该应用程序在尝试查询AppItems时只是挂起。该表存在于数据库中,但这并不重要,因为我们对查询数据库的了解还不够广泛,我们首先无法构建查询。
在此先感谢您的帮助。
最佳答案
我发现了问题所在。
我正在使用Table-per-Type进行继承。由于AppItem是基本类型,因此它生成的用于查询它的SQL查询非常庞大(在这种情况下为数千行),并且会引起问题。
因此,基本上,在使用Table-per-Type时,您需要避免查询具有多个继承自这些基本类型的基本类型。
关于c# - Linq到实体DbQuery对象很难失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31457094/