.Select与.Include与.Select Many的区别

8
我找到了以下关于.Select和.SelectMany之间区别的例子。
public class PhoneNumber
{
    public string Number { get; set; }
}

public class Person
{
    public IEnumerable<PhoneNumber> PhoneNumbers { get; set; }
}

IEnumerable<Person> people = new List<Person>();

// Select gets a list of lists of phone numbers
IEnumerable<IEnumerable<PhoneNumber>> phoneLists = people.Select(p => p.PhoneNumbers);

// SelectMany flattens it to just a list of phone numbers.
IEnumerable<PhoneNumber> phoneNumbers = people.SelectMany(p => p.PhoneNumbers);

但我实际上无法准确理解 "Select 获取一个电话号码列表的列表" 和 "SelectMany 将其扁平化为仅包含电话号码的列表" 之间的区别。

第二个问题,写作方式有何不同:

people.Select(p => p.PhoneNumbers);

&

people.Include(p => p.PhoneNumbers); 
2个回答

14

Select 获取一个电话号码的列表,而 SelectMany 将其扁平化成一个电话号码列表。

这正是它们之间的区别。SelectMany 接收一个集合的集合并将所有项作为一个集合返回。

people.Select(p => p.PhoneNumbers);

仅选择电话号码。

people.Include(p => p.PhoneNumbers); 

选择已加载电话号码的人员实体。


那么这句话的意思是什么呢?“这正是区别所在。SelectMany接收一个集合的集合,并将所有项作为一个集合返回。” - John John
2
项目是相同的,但它们被压缩成一个列表。因此,您不会有 List<List<A>>,而是由源的所有内部列表的项目连接而成的 List<A> - MarcinJuraszek
这两种不同类型的集合有什么想法? - John John

1
你已经回答了你的第一个问题。=) people.Include(x=>x.PhoneNumbers)会加载peoples中的电话号码。如果你没有这样做,people.PhoneNumber将为null并且未加载。
因此,由于PhoneNumbers为null且未加载,所以该语句不会执行:
var phonenumbers = db.peoples.First().PhoneNumbers;
//phonenumbers = null

但是如果你这样做:

但是如果你这样做:

var phonenumbers = db.peoples.Include(x=>x.PhoneNumbers).First().PhoneNumbers;
//phonenumbers will now be a IEnumerable with Phonenumbers

但我不明白这两者之间的区别:“select获取电话号码列表的列表,而SelectMany将其展平为仅电话号码列表。” - John John
这就是重点...如果你只想要电话号码并使用select,你将会收到一个IE<IE<PhoneNumber>>,而使用selectmany则可以得到一个IE<PhoneNumber>,在某些情况下非常方便。 - Jonas W

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接