Ngôn ngữ LINQ - Toán tử CrossJoin

Toán tử CrossJoin trong LINQ

Khái niệm CROSS JOIN có lẽ ít người biết và thực sự nó cũng rất ít được sử dụng. Chúng ta xem ví dụ sau:

Từ hình ảnh trên thì với mỗi phần tử của bảng A thì sẽ liên kết với tất cả các phần tử của bảng B. Vậy chúng ta có tổng cộng 2×3=6 bản ghi sẽ được hiển thị.

Lớp Model và nguồn dữ liệu

Chúng ta sẽ sử dụng các lớp Student và Subject sau đây:

public class Student
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public static List<Student> GetAllStudnets()
        {
            return new List<Student>()
            {
                new Student { ID = 1, Name = "Preety"},
                new Student { ID = 2, Name = "Priyanka"},
                new Student { ID = 3, Name = "Anurag"},
                new Student { ID = 4, Name = "Pranaya"},
                new Student { ID = 5, Name = "Hina"}
            };
        }
    }
    public class Subject
    {
        public int ID { get; set; }
        public string SubjectName { get; set; }
        public static List<Subject> GetAllSubjects()
        {
            return new List<Subject>()
            {
                new Subject { ID = 1, SubjectName = "ASP.NET"},
                new Subject { ID = 2, SubjectName = "SQL Server" },
                new Subject { ID = 5, SubjectName = "Linq"}
            };
        }
    }

Ví dụ1: CrossJoin sử dụng cú pháp Query:

using System.Linq;
using System;
namespace LINQJoin
{
    class Program
    {
        public static void Main(string[] args)
        {
            var CrossJoinResult = from employee in Student.GetAllStudnets()
                         from subject in Subject.GetAllSubjects()
                         select new {
                             Name = employee.Name,
                             SubjectName = subject.SubjectName
                         };
            foreach (var item in CrossJoinResult)
            {
                Console.WriteLine("Name {0} : Subject: {1}",item.Name, item.SubjectName);
            }
           
        }
    }
}

Kết quả:

Name Preety : Subject: ASP.NET
Name Preety : Subject: SQL Server
Name Preety : Subject: Linq
Name Priyanka : Subject: ASP.NET
Name Priyanka : Subject: SQL Server
Name Priyanka : Subject: Linq
Name Anurag : Subject: ASP.NET
Name Anurag : Subject: SQL Server
Name Anurag : Subject: Linq
Name Pranaya : Subject: ASP.NET
Name Pranaya : Subject: SQL Server
Name Pranaya : Subject: Linq
Name Hina : Subject: ASP.NET
Name Hina : Subject: SQL Server
Name Hina : Subject: Linq

Xem ví dụ

Ví dụ 2: Cross Join sử dụng phương thức:

Để thực thi Cross Join sử dụng phương thức, chúng ta cần sử dụng phương thức SelectMany () hoặc phương thức Join ():

using System.Linq;
using System;
namespace LINQJoin
{
    class Program
    {
        public static void Main(string[] args)
    {
             //Cross Join using SelectMany Method
            var CrossJoinResult = Student.GetAllStudnets()
                        .SelectMany(sub => Subject.GetAllSubjects(),
                         (std, sub) => new
                         {
                             Name = std.Name,
                             SubjectName = sub.SubjectName
                         });
            //Cross Join using Join Method
            var CrossJoinResult2 = Student.GetAllStudnets()
                        .Join(Subject.GetAllSubjects(),
                            std => true,
                            sub => true,
                            (std, sub) => new
                            {
                                Name = std.Name,
                                SubjectName = sub.SubjectName
                            }
                         );
            foreach (var item in CrossJoinResult2)
            {
                Console.WriteLine("Name : {0}, Subject: {1}", item.Name, item.SubjectName);
            }
        }
    }

Kết quả:

Name : Preety, Subject: ASP.NET
Name : Preety, Subject: SQL Server
Name : Preety, Subject: Linq
Name : Priyanka, Subject: ASP.NET
Name : Priyanka, Subject: SQL Server
Name : Priyanka, Subject: Linq
Name : Anurag, Subject: ASP.NET
Name : Anurag, Subject: SQL Server
Name : Anurag, Subject: Linq
Name : Pranaya, Subject: ASP.NET
Name : Pranaya, Subject: SQL Server
Name : Pranaya, Subject: Linq
Name : Hina, Subject: ASP.NET
Name : Hina, Subject: SQL Server
Name : Hina, Subject: Linq

Xem ví dụ