Csharp/CSharp Tutorial/LINQ/Join

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

Cartesian Join demo

<source lang="csharp">using System; using System.Collections.Generic; using System.Linq; using System.Text;

   class MainClass
   {
       static void Main()
       {
           var query = from first in Enumerable.Range(1, 5)
                       from second in Enumerable.Range(1, first)
                       select new { first, second };
           foreach (var item in query)
           {
               Console.WriteLine(item);
           }
       }
   }</source>

Join Operator

<source lang="csharp">using System; using System.Linq; using System.Collections; using System.Collections.Generic;

public class Employee {

   public int id;
   public string firstName;
   public string lastName;
   public static ArrayList GetEmployeesArrayList() {
       ArrayList al = new ArrayList();
       al.Add(new Employee { id = 1, firstName = "J", lastName = "R" });
       al.Add(new Employee { id = 2, firstName = "W", lastName = "G" });
       al.Add(new Employee { id = 3, firstName = "A", lastName = "H" });
       al.Add(new Employee { id = 4, firstName = "D", lastName = "L" });
       al.Add(new Employee { id = 101, firstName = "K", lastName = "F" });
       return (al);
   }
   public static Employee[] GetEmployeesArray() {
       return ((Employee[])GetEmployeesArrayList().ToArray());
   }

} public class EmployeeOptionEntry {

   public int id;
   public long optionsCount;
   public DateTime dateAwarded;
   public static EmployeeOptionEntry[] GetEmployeeOptionEntries() {
       EmployeeOptionEntry[] empOptions = new EmployeeOptionEntry[] {
     new EmployeeOptionEntry {
       id = 1,
       optionsCount = 2,
        dateAwarded = DateTime.Parse("1999/12/31") },
      new EmployeeOptionEntry {
       id = 101,
       optionsCount = 2,
       dateAwarded = DateTime.Parse("1998/12/31") }
   };
       return (empOptions);
   }

} public class MainClass {

   public static void Main() {
       Employee[] employees = Employee.GetEmployeesArray();
       EmployeeOptionEntry[] empOptions = EmployeeOptionEntry.GetEmployeeOptionEntries();
       var employeeOptions = employees
         .Join(
           empOptions,      
           e => e.id,       
           o => o.id,       
           (e, o) => new    
                     {
                         id = e.id,
                         name = string.Format("{0} {1}", e.firstName, e.lastName),
                         options = o.optionsCount
                     });
       foreach (var item in employeeOptions)
           Console.WriteLine(item);
   }

}</source>

Join three object list

<source lang="csharp">using System; using System.Collections; using System.Collections.Generic; using System.Text; using System.Linq; using System.Reflection; class Salary {

   int _id;
   int _year;
   double _salary;
   public int ID {
       get { return _id; }
       set { _id = value; }
   }
   public int Year {
       get { return _year; }
       set { _year = value; }
   }
   public double SalaryPaid {
       get { return _salary; }
       set { _salary = value; }
   }

} class Employee {

   int _id;
   int _idRole;
   string _lastName;
   string _firstName;
   public int ID {
       get { return _id; }
       set { _id = value; }
   }
   public int IDRole {
       get { return _idRole; }
       set { _idRole = value; }
   }
   public string LastName {
       get { return _lastName; }
       set { _lastName = value; }
   }
   public string FirstName {
       get { return _firstName; }
       set { _firstName = value; }
   }

} class Role {

   int _id;
   string role;
   public int ID {
       get { return _id; }
       set { _id = value; }
   }
   public string Role {
       get { return role; }
       set { role = value; }
   }

} public class MainClass {

   public static void Main() {
       List<Employee> people = new List<Employee> {
              new Employee { ID = 1, IDRole = 1, LastName = "A", FirstName = "B"},
              new Employee { ID = 2, IDRole = 2, LastName = "G", FirstName = "T"},
              new Employee { ID = 3, IDRole = 2, LastName = "G", FirstName = "M"},
              new Employee { ID = 4, IDRole = 3, LastName = "C", FirstName = "G"}
           };
       List<Role> roles = new List<Role> {
              new Role { ID = 1, Role = "Manager" },
              new Role { ID = 2, Role = "Developer" }
           };
       List<Salary> salaries = new List<Salary> {
              new Salary { ID = 1, Year = 2004, SalaryPaid = 10.00 },
              new Salary { ID = 1, Year = 2005, SalaryPaid = 15.00 },
              new Salary { ID = 1, Year = 2005, SalaryPaid = 15.00 }
           };
       var query = from p in people
                   join s in salaries on p.ID equals s.ID
                   select new { p.FirstName, p.LastName, s.SalaryPaid };
       var querySum = from q in query
                      group q by q.LastName into gp
                      select new { LastName = gp.Key, TotalSalary = gp.Sum(q => q.SalaryPaid) };
   }

}</source>

Join two object lists

<source lang="csharp">using System; using System.Collections; using System.Collections.Generic; using System.Text; using System.Linq; using System.Reflection; class Person {

   int _id;
   int _idRole;
   string _lastName;
   string _firstName;
   public int ID {
       get { return _id; }
       set { _id = value; }
   }
   public int IDRole {
       get { return _idRole; }
       set { _idRole = value; }
   }
   public string LastName {
       get { return _lastName; }
       set { _lastName = value; }
   }
   public string FirstName {
       get { return _firstName; }
       set { _firstName = value; }
   }

} class Role {

   int _id;
   string role;
   public int ID {
       get { return _id; }
       set { _id = value; }
   }
   public string Role {
       get { return role; }
       set { role = value; }
   }

} class Program {

   static void Main(string[] args) {
       List<Person> people = new List<Person> {
             new Person  { ID = 1, IDRole = 1, LastName = "A", FirstName = "B"},
             new Person  { ID = 2, IDRole = 2, LastName = "G", FirstName = "T"},
             new Person  { ID = 3, IDRole = 2, LastName = "G", FirstName = "M"},
             new Person  { ID = 4, IDRole = 3, LastName = "C", FirstName = "G"}
           };
       List<Role> roles = new List<Role> {
             new Role  { ID = 1, Role = "Manager" },
             new Role  { ID = 2, Role = "Developer" }
           };
       var query = from p in people
                   where p.ID == 1
                   from r in roles
                   where r.ID == p.IDRole
                   select new { p.FirstName, p.LastName, r.Role };
   }

}</source>

Use join key word

<source lang="csharp">using System; using System.Collections; using System.Collections.Generic; using System.Text; using System.Linq; using System.Reflection; class Person {

   int _id;
   int _idRole;
   string _lastName;
   string _firstName;
   public int ID {
       get { return _id; }
       set { _id = value; }
   }
   public int IDRole {
       get { return _idRole; }
       set { _idRole = value; }
   }
   public string LastName {
       get { return _lastName; }
       set { _lastName = value; }
   }
   public string FirstName {
       get { return _firstName; }
       set { _firstName = value; }
   }

} class Role {

   int _id;
   string role;
   public int ID {
       get { return _id; }
       set { _id = value; }
   }
   public string Role {
       get { return role; }
       set { role = value; }
   }

} class Program {

   static void Main(string[] args) {
       List<Person> people = new List<Person> {
             new Person  { ID = 1, IDRole = 1, LastName = "A", FirstName = "B"},
             new Person  { ID = 2, IDRole = 2, LastName = "G", FirstName = "T"},
             new Person  { ID = 3, IDRole = 2, LastName = "G", FirstName = "M"},
             new Person  { ID = 4, IDRole = 3, LastName = "C", FirstName = "G"}
           };
       List<Role> roles = new List<Role> {
             new Role  { ID = 1, Role = "Manager" },
             new Role  { ID = 2, Role = "Developer" }
           };
       var query = from p in people
                   join r in roles on p.IDRole equals r.ID
                   select p;
   }

}</source>

Use Join on

<source lang="csharp">using System; using System.Collections; using System.Collections.Generic; using System.Text; using System.Linq; using System.Reflection; class Salary {

   int _id;
   int _year;
   double _salary;
   public int ID {
       get { return _id; }
       set { _id = value; }
   }
   public int Year {
       get { return _year; }
       set { _year = value; }
   }
   public double SalaryPaid {
       get { return _salary; }
       set { _salary = value; }
   }

} class Employee {

   int _id;
   int _idRole;
   string _lastName;
   string _firstName;
   public int ID {
       get { return _id; }
       set { _id = value; }
   }
   public int IDRole {
       get { return _idRole; }
       set { _idRole = value; }
   }
   public string LastName {
       get { return _lastName; }
       set { _lastName = value; }
   }
   public string FirstName {
       get { return _firstName; }
       set { _firstName = value; }
   }

} class Role {

   int _id;
   string role;
   public int ID {
       get { return _id; }
       set { _id = value; }
   }
   public string Role {
       get { return role; }
       set { role = value; }
   }

} public class MainClass {

   public static void Main() {
       List<Employee> people = new List<Employee> {
             new Employee  { ID = 1, IDRole = 1, LastName = "A", FirstName = "B"},
             new Employee  { ID = 2, IDRole = 2, LastName = "G", FirstName = "T"},
             new Employee  { ID = 3, IDRole = 2, LastName = "G", FirstName = "M"},
             new Employee  { ID = 4, IDRole = 3, LastName = "C", FirstName = "G"}
           };
       List<Role> roles = new List<Role> {
              new Role { ID = 1, Role = "Manager" },
              new Role { ID = 2, Role = "Developer" }
           };
       List<Salary> salaries = new List<Salary> {
              new Salary { ID = 1, Year = 2004, SalaryPaid = 10000.00 },
              new Salary { ID = 1, Year = 2005, SalaryPaid = 15000.00 },
              new Salary { ID = 1, Year = 2005, SalaryPaid = 15000.00 }
           };
       var query = from p in people
                   join s in salaries on p.ID equals s.ID
                   where p.ID == 1
                   select s.SalaryPaid;
       Console.Write(query.Min());
       Console.Write(query.Max());
   }

}</source>