[英]query multi-level entity with filter at the lowest level
所以我有3個實體類:
public partial class Event
{
public Event()
{
Recurrences = new HashSet<Recurrence>();
}
public int Id { get; set; }
public ICollection<Recurrence> Recurrences { get; set; }
}
public partial class Recurrence
{
public Recurrence()
{
AspNetUsers = new HashSet<AspNetUser>();
}
public int Id { get; set; }
public int EventId { get; set; }
public ICollection<AspNetUser> AspNetUsers { get; set; }
}
public partial class AspNetUser
{
public AspNetUser()
{
Recurrences = new HashSet<Recurrence>();
}
public string Id { get; set; }
public string UserName { get; set; }
public ICollection<Recurrence> Recurrences { get; set; }
}
我想使用實體行獲得給定aspnetuser.id的事件。 到目前為止,這就是我所擁有的,但是它返回一個錯誤:
// GET: api/Events?userId={userId}
public IQueryable<Event> GetEvents(string userId)
{
return db.Events
.Include(e => e.Recurrences
.Select(u => u.AspNetUsers.Where(i => i.Id == userId)));
}
當我排除where子句時,它可以正常工作。 請幫忙。 提前致謝!
我認為Include()並不意味着您認為的含義。 ( https://msdn.microsoft.com/zh-cn/library/bb738708%28v=vs.110%29.aspx )它的作用是告訴數據庫集確保引入該對象的關系。 默認情況下(我最后檢查過),數據庫上下文將自動拉入所有關系,因此這不是必需的。 但是,如果您關閉了延遲加載( http://www.entityframeworktutorial.net/EntityFramework4.3/lazy-loading-with-dbcontext.aspx ),則需要.Include()所有關系您想要包含在查詢中。
這應該可以解決您的問題。 但是,我不保證生成的SQL不會很傻。
如果您啟用了延遲加載:
db.Events.Include("Recurrences").Include("Recurrences.AspNetUsers")
.Where(e => e.Recurrences
.Any(r => r.AspNetUsers
.Any(u => u.Id ==userId)));
如果您關閉了延遲加載:
db.Events
.Where(e => e.Recurrences
.Any(r => r.AspNetUsers
.Any(u => u.Id ==userId)));
另外,如果您看不到錯誤,可以在返回之前使用.ToList()查詢,這樣它就不會在您的代碼中失敗,也不會在Web API堆棧的深處出現。 就個人而言,我喜歡這樣做,以便可以嘗試/捕獲查詢並正確處理它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.