我想知道是否有人可以了解这里可能发生的事情。我正在使用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时挂起。该表存在于数据库中,但这并不重要,因为我们没有查询数据库,我们无法首先构建查询。
提前感谢您的帮助。
答案 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
}