簡體   English   中英

使用最低級別的過濾器查詢多級實體

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM