使用最低级别的过滤器查询多级实体

时间:2015-06-19 01:01:18

标签: c# asp.net asp.net-web-api linq-to-entities

所以我有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; }
}

我想使用line to entity获取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子句时,它工作正常。请帮忙。 提前谢谢!

1 个答案:

答案 0 :(得分:0)

我不认为Include()意味着你的意思。 (https://msdn.microsoft.com/en-us/library/bb738708%28v=vs.110%29.aspx)它的作用是告诉数据库集确保为该对象引入关系。默认情况下(最后一次检查),db上下文将自动拉入所有关系,因此这不是必需的。但是,如果您已关闭延迟加载(http://www.entityframeworktutorial.net/EntityFramework4.3/lazy-loading-with-dbcontext.aspx),那么您需要.Include()您希望在查询中拥有的所有关系。

这应该可以解决您的问题。但我并不保证生成的SQL不会愚蠢。

如果您启用了延迟加载:

email.send_keys(email)

如果您关闭延迟加载:

db.Events.Include("Recurrences").Include("Recurrences.AspNetUsers")
  .Where(e => e.Recurrences
    .Any(r => r.AspNetUsers
      .Any(u => u.Id ==userId)));

此外,如果您在查看错误时遇到问题,可以在返回之前.ToList()查询,以便在代码中失败并且不在Web API堆栈内部。就个人而言,我喜欢这样做,以便我可以尝试/捕获查询并正确处理它。