2013-04-13 35 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將不會加載/生成新數據。