我有两门课,个人和团体
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; }
}
给定一个person实例p,,如何获得属于p是发件人的组的所有人员?
方式如下:
List<Person> results = new List<Person>();
foreach (Group group in p.GroupsWhereIAmSender)
{
results.AddRange(group.Members);
}
但是我想用“linq到实体”的方式来做,这样我就不会耗尽内存。
发布于 2013-04-13 13:24:59
使用SelectMany
results = p.GroupsWhereIAmSender.SelectMany(g => g.Members);
发布于 2013-04-13 14:42:13
“linq到对象”的方法是按照已经建议的方式使用SelectMany
,而“linq到实体”的方式也是使用SelectMany
,但是有一个DataContext
作为源(确切地说,是IQueryable
)。
在这两种情况下,表达式都是:p.GroupsWhereIAmSender.SelectMany(g => g.Members)
(您可能希望向结果中添加Distinct
,以避免重复的值)。
“linq到对象”和“linq到实体”之间的区别在于,“linq到实体”使用IQueryable
和一个表达式树,可以在运行时转换为that。这样,就可以在底层数据库上进行筛选和排序,而不是将所有内容加载到内存中。
但是,您的代码没有显示出存在DataContext
的任何提示。所以我得假设你所有的数据都在内存里。因此,您不会耗尽内存,因为SelectMany
不会加载/生成新数据。
https://stackoverflow.com/questions/15993027
复制相似问题