0

我有两个类,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 将是这样的:

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

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

但我想以“linq-to-entities”的方式来做,这样我就不会耗尽内存。

4

2 回答 2

2

“linq-to-objects”方式将SelectMany按照已经建议的方式使用,“linq-to-entities”方式也将使用SelectMany但将 aDataContext作为源(IQueryable准确地说是 an)。

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

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

但是,您的代码没有显示任何提示存在DataContext. 所以我必须假设你所有的数据都已经在内存中了。SelectMany因此,您不会因为不会加载/生成新数据而耗尽内存。

于 2013-04-13T22:42:13.867 回答
1

使用SelectMany

results = p.GroupsWhereIAmSender.SelectMany(g => g.Members);
于 2013-04-13T21:24:59.467 回答