我想知道是否有人可以阐明这里可能发生的事情。我正在使用带有实体框架的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/

10-11 15:58