。选择Vs。包括Vs.Select Many

时间:2013-07-09 09:12:34

标签: c# linq entity-framework

我找到了以下关于.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);

但实际上我无法理解它们之间的区别(选择获取电话号码列表的列表,而SelectMany将其展平为电话号码列表。)。

Seond问题,写作之间有什么区别: -

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

&安培;

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

2 个答案:

答案 0 :(得分:11)

  

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

这正是差异。 SelectMany获取集合的集合并将所有项目作为一个集合返回。

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

仅选择电话号码。

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

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

答案 1 :(得分: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