Csharp/CSharp Tutorial/LINQ/Join

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

Cartesian Join demo

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);
            }
        }
    }

Join Operator

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);
    }
}

Join three object list

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) };
    }
}

Join two object lists

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 };
    }
}

Use join key word

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;
    }
}

Use Join on

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());
    }
}