Linq对实体DbQuery对象的失败很难

时间:2015-07-16 14:28:19

标签: c# linq entity-framework

我想知道是否有人可以了解这里可能发生的事情。我正在使用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),我可以查询所有这些。 因此,其中成员是DbSet,成员继承自AppItem:

var foofoo = _context.Members.Where(ai => ai.id = 101);
var sql = foofoo.ToString();

这个工作正常; foofoo.ToString()返回构造的SQL,一切看起来都是有序的。

对我来说这似乎很奇怪,没有任何错误消息或任何内容,应用程序只是在尝试查询AppItem时挂起。该表存在于数据库中,但这并不重要,因为我们没有查询数据库,我们无法首先构建查询。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

我发现了问题所在。 我使用Table-per-Type进行继承。使用AppItem作为基类型,它为查询它生成的SQL查询是巨大的(在这种情况下长几千行)并导致问题。 基本上,在使用Table-per-Type时,您需要避免查询具有多个类型的基类型。

答案 1 :(得分:0)

我假设你的查询意味着返回1项。

在查询末尾添加.FirstOrDefault();以仅返回一个项目(您当前的查询返回类型为AppItems的IQueriable)

实体框架在需要之前不执行查询,因此在您的代码中,它将在调用.ToString()方法时执行查询。

试试这个:

var booboo = _context.AppItems.Where(ai => ai.id == 101).FirstOrDefault();

if (booboo != null)
{
    var sql = booboo.ToString();

    //etc
}