2013-04-13 34 views
0

我有两个类Person和LINQ的工会列表对象的列表(属性)

集团
class Person { 
    public virtual ICollection<Group> GroupsWhereIAmMember { get; set; } 
    public virtual ICollection<Group> GroupsWhereIAmSender { get; set; } 
} 

class Group { 
    public virtual ICollection<Person> Members { get; set; } 
    public virtual ICollection<Person> Senders { get; set; } 
} 

考虑一个人例如P,我怎样才能得到属于组,其中p为所有的人发送者?

的LINQ对象的方法是这样的:

List<Person> results = new List<Person>(); 

foreach (Group group in p.GroupsWhereIAmSender) 
{ 
    results.AddRange(group.Members); 
} 

但我想这样做的“LINQ到实体”的方式,所以我不耗尽内存。

回答

1

使用SelectMany

results = p.GroupsWhereIAmSender.SelectMany(g => g.Members); 
2

的“LINQ到对象”的方式是使用SelectMany如已经建议和“LINQ到实体”的方式是也使用SelectMany但有作为源的DataContext(准确地说是IQueryable)。

在这两种情况下,表达式都是:p.GroupsWhereIAmSender.SelectMany(g => g.Members) (您可能需要将Distinct添加到结果中以避免重复值)。

“linq-to-objects”和“linq-to-entities”之间的区别在于“linq-to-entities”使用IQueryable以及可以在运行时转换为T-SQL的表达式树。这种方式可以在底层数据库上完成过滤和排序,而不是将所有内容都加载到内存中。

但是,您的代码不显示任何暗示有DataContext。所以我必须假设你的所有数据已经​​在内存中。因此,您不会用尽内存,因为SelectMany将不会加载/生成新数据。