Query不返回子集合

时间:2016-08-08 21:02:11

标签: entity-framework linq entity-framework-core

我仍然为此付出了努力,为什么每个'Category'项都会返回null'Task'集合。我在数据库中有数据,我缺少什么?

public class ApplicationUser : IdentityUser
{
    public ICollection<Category> Categories { get; set; }
}

public class Category
{
    public int CategoryId { get; set; }
    public string Name { get; set; }
    public DateTime Timestamp { get; set; }

    public ICollection<Task> Tasks { get; set; }
}

public class Task
{
    public int TaskId { get; set; }
    public string Name { get; set; }
    public DateTime Timestamp { get; set; }
}

以下是查询:

public IEnumerable<Category> GetAllForUser(string name)
{
    return _ctx.Users.Where(x => x.UserName == name)
                     .SelectMany(x => x.Categories)
                     .Include(x => x.Tasks).ToList();    
}

3 个答案:

答案 0 :(得分:3)

您的查询属于Ignored Includes案例:

  

如果更改查询以使其不再返回查询开头的实体类型的实例,则忽略包含运算符。

如链接中所述,如果您将以下内容添加到DbContext OnConfiguring

optionsBuilder.ConfigureWarnings(warnings => warnings.Throw(CoreEventId.IncludeIgnoredWarning));

然后代替null集合,您将在错误消息中收到包含类似内容的InvalidOperationException

  

导航的包含操作:&#39; x.Tasks&#39;被忽略,因为在最终查询结果中无法访问目标导航。

那么如何解决这个问题呢?显然,要求是从要添加的实体开始查询。在您的情况下,您应该从_ctx.Categories开始。但是为了应用相同的过滤器,您需要将Application.Users的反向导航属性添加到Category类:

public class Category
{
    // ...
    public ApplicationUser ApplicationUser { get; set; }
}

现在以下内容将起作用:

public IEnumerable<Category> GetAllForUser(string name)
{
    return _ctx.Categories
        .Where(c => c.ApplicationUser.UserName == name)
        .Include(c => c.Tasks)
        .ToList();    
}

答案 1 :(得分:0)

试试这个:

public IEnumerable<Category> GetAllForUser(string name)
{
    return _ctx.Users
                .Include(u => u.Categories)
                .Include(u => u.Categories.Select(c => c.Tasks))
                .Where(x => x.UserName == name)
                .SelectMany(x => x.Categories)
                .ToList();    
}

答案 2 :(得分:0)

public virtual ICollection<Task> Tasks { get; set; }