我有两个类,Person和Group
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 to objects方式将是:
List<Person> results = new List<Person>();
foreach (Group group in p.GroupsWhereIAmSender)
{
results.AddRange(group.Members);
}
但我想以“linq-to-entities”的方式做到这一点,所以我的内存不足。
答案 0 :(得分:2)
“linq-to-objects”的方式是使用已经建议的SelectMany
,而“linq-to-entities”的方式也是使用SelectMany
但是要DataContext
1}}作为来源(准确地说IQueryable
)。
在这两种情况下,表达式为:p.GroupsWhereIAmSender.SelectMany(g => g.Members)
(您可能希望在结果中添加Distinct
以避免重复值。)
“linq-to-objects”和“linq-to-entities”之间的区别在于“linq-to-entities”使用IQueryable
和一个表达式树,可以在运行时转换为T-SQL 。这种方式可以在底层数据库上完成过滤和排序,而不是将所有内容加载到内存中。
但是,您的代码没有显示任何DataContext
的提示。所以我必须假设你的所有数据都在内存中。因此,您不会因为SelectMany
无法加载/生成新数据而耗尽内存。
答案 1 :(得分:1)
使用SelectMany
:
results = p.GroupsWhereIAmSender.SelectMany(g => g.Members);