Data from multiple sources and types can be transformed and integrated in a number of ways using LINQ's projection and shaping operators:   The elements of a sequence can be projected into a new form using the select operator. By using a lambda expression on each component in a sequence, a new type or instance of an existing type can be created.  IEnumerable people = ...
IEnumerable names = people.Select(p => p.Name);  SelectMany operator: The SelectMany operator is used to flatten a sequence of sequences into a single sequence. It can be used to combine elements from multiple collections or to project nested sequences into a single sequence.  IEnumerable people = ...
IEnumerable phoneNumbers = people.SelectMany(p => p.PhoneNumbers);  Using the GroupBy operator, you can group sequence components according to a key. It can be used to construct a new collection of groups by grouping elements from other collections using a common key.  IEnumerable people = ...
IEnumerable> groups = people.GroupBy(p => p.City);  Join operator: Based on a shared key, the Join operator is used to integrate components of two collections. It can be used to bring together information from several sources and produce a new group of connected elements.  IEnumerable people = ...
IEnumerable phoneNumbers = ...
var query = from person in people
join phone in phoneNumbers on person.Id equals phone.PersonId
select new { Person = person, Phone = phone.Number };  The distinct operator is used to eliminate redundant elements from a sequence. It can be used to remove redundant information and clean up data from various sources.  IEnumerable emails = ...
IEnumerable uniqueEmails = emails.Distinct();  The aggregate operator can be used for any custom aggregation, including Sum, Min, Max, and Average, by applying a function to each element in a collection and returning a single value.  IEnumerable numbers = ...
double average = numbers.Average();