Csharp/CSharp Tutorial/LINQ/Join — различия между версиями
Admin (обсуждение | вклад) м (1 версия) |
|
(нет различий)
|
Версия 18:31, 26 мая 2010
Содержание
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>