Linq联合列表(属性)的对象列表

时间:2013-04-13 21:14:29

标签: c# linq list linq-to-entities

我有两个类,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”的方式做到这一点,所以我的内存不足。

2 个答案:

答案 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);