7

我发现了以下关于 .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); 
4

2 回答 2

13

Select 获取电话号码列表,而 SelectMany 将其展平为电话号码列表。

这正是不同之处。SelectMany接受集合的集合并将所有项目作为一个集合返回。

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

仅选择电话号码。

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

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

于 2013-07-09T09:17:23.260 回答
1

你已经回答了你的第一个问题。=)

这 :people.Include(x=>x.PhoneNumbers)

将在人民中加载电话号码。如果您不这样做,则 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
于 2013-07-09T09:19:06.363 回答