2014-05-05 93 views
0

我有我的数据库用户订阅的列表,每个订阅具有类别,每个类别都有路径的列表,每个路径具有的文章列表?多重嵌套导航属性EF?

型号

class User { 
    ICollection<Subscription> Subscriptions; 
} 
class Subscription { 
    Category category; 
} 
class Category { 
    ICollection<Path> paths; 
} 
class Path{ 
    ICollection<Article> Articles; 
} 

我的问题

如何检索所有文章为特定用户?

回答

0

使用的SelectSelectMany语句的组合,您可以穿越你的实体,并找到你需要的集合:

var allUserArticles = myUser.Subscriptions 
    .Select(sub => sub.Category) //take the category from each subscription 
    .SelectMany(cat => cat.Paths) //Take each path from each category, put them in a single list 
    .SelectMany(path => path.Articles) //Take each article from each path, put them in a single list 
    .ToList(); 

需要注意的是,如果这些机构需要从数据库中自动载入,即EF需要实现急切的加载,或者在运行上述语句之前,必须确保检索所有需要的相关实体。意外的空值可能会导致您的输出不正确。

但是,我没有这方面的信息,因为它从问题中缺失,所以我无法知道您的具体情况。

+0

没有即时通讯不执行急切加载,我必须使用包括之前,这些选择? db.Users.Include(“Subscriptions.Category.Paths.Articles”)。First()。订阅 .Select(sub => sub.Category) .SelectMany(cat => cat.Paths) .SelectMany(path = > path.Articles) .ToList(); 另一个问题是,这些选择在SQL服务器中运行,还是在内存中运行结果后运行? –

+0

是的。它不会像一条线那样完成,但我认为你已经把它作为一个简单的例子。一般来说,你会想使用Include来确保一切都被加载,然后使用上面的Select语句。 – Flater

+0

额外注意:不要担心为此使用多行,如果您要连接到数据库,只有当您实际想要访问实例时才会运行查询。在这种情况下,这意味着LINQ将在'ToList()'调用中运行已编译的查询,而不是在它之前。通常,查询将在您第一次尝试获取某个Article对象时运行。 – Flater