Thứ hai, ngày 5 tháng 12 năm 2016

LINQ – Ví dụ về Multiple Inner Join (C#)

Ngày đăng: 19/3/2012, 12:49:35AM | Lượt xem: 7,545
Hot!

Trong bài trước “LINQ – Sử dụng Inner Join” tôi đã giới thiệu cơ bản về Inner Join trong LINQ, tuy nhiên ví dụ trong bài chỉ thực hiện join hai bảng với một mệnh đề join. Bài viết này sẽ tiếp tục về chủ đề Inner Join với ví dụ từ ba bảng Orders, OrderDetails và Products trong Northwind database.

Trong bài trước “LINQ – Sử dụng Inner Join” tôi đã giới thiệu cơ bản về Inner Join trong LINQ, tuy nhiên ví dụ trong bài chỉ thực hiện join hai bảng với một mệnh đề join. Bài viết này sẽ tiếp tục về chủ đề Inner Join với ví dụ từ ba bảng Orders, OrderDetails và Products trong Northwind database.

Cú pháp chung để thực hiện kết trong LINQ với nhiều mệnh đề join là viết các mệnh đề join liên tiếp nhau:

from clause
join clause
join clause

select clause

Bảng OrderDetails được tạo ra do mối quan hệ giữa Products và Orders là Many-to-Many. Mô hình quan hệ của 3 bảng trong ví dụ này được minh họa như sau:

Các class tương ứng với 3 bảng trên trong C#:

class Product
{
	public int ProductID;
	public string ProductName;
}
class Order
{
	public int OrderID;
	public DateTime OrderDate;
}
class OrderDetail
{
	public int OrderID;
	public int ProductID;
	public int Quantity;
}

Trong ví dụ này thay vì gán giá trị các thuộc tính của đối tượng thông qua constructor, tôi sẽ gán thông qua tính năng object initializers trong C# 3. Điều này giúp bạn dễ nhận ra ý nghĩa của các tham số truyền vào đối tượng.

Tạo dữ liệu:

var products=new Product[]{
	new Product() { ProductID=1, ProductName="Windows Seven" },
	new Product() { ProductID=2, ProductName="Macintosh OS" },
	new Product() { ProductID=3, ProductName="Android" },
	new Product() { ProductID=4, ProductName="Chromium OS" }
};

var orders=new Order[]{
	new Order() { OrderID=100, OrderDate=new DateTime(2011,1,1)},
	new Order() { OrderID=101, OrderDate=new DateTime(2011,1,2)},
	new Order() { OrderID=102, OrderDate=new DateTime(2011,1,3)},
	new Order() { OrderID=103, OrderDate=new DateTime(2011,1,4)}
};

var orderDetails = new OrderDetail[]{
	new OrderDetail() { OrderID=100, ProductID=1, Quantity=10 },
	new OrderDetail() { OrderID=101, ProductID=2, Quantity=20 },
	new OrderDetail() { OrderID=102, ProductID=3, Quantity=30 },
	new OrderDetail() { OrderID=102, ProductID=4, Quantity=40 },
};

Cuối cùng ta thực hiện truy vấn để lấy ra các dòng trong OrderDetails với các thông tin thêm vào là ProductName và OrderDate.

Phiên bản sử dụng hai mệnh đề join:

var orderDetailRecords=from p in products
		join od in orderDetails on p.ProductID equals od.ProductID
		join o in orders on od.OrderID equals o.OrderID
		select new
		{
			ProductName=p.ProductName,
			OrderDate=o.OrderDate.ToShortDateString(),
			Quantity=od.Quantity
		};

Phiên bản sử dụng ba mệnh đề from:

var orderDetailRecords=from p in products
			from od in orderDetails
			from o in orders
			where p.ProductID==od.ProductID && od.OrderID==o.OrderID
			select new
			{
				ProductName=p.ProductName,
				OrderDate=o.OrderDate.ToShortDateString(),
				Quantity=od.Quantity
			};

Kết quả (LINQPad):

IEnumerable<> (4 items)
ProductName OrderDate Quantity
Windows Seven 1/1/2011

10

Macintosh OS 1/2/2011

20

Android 1/3/2011

30

Chromium OS 1/3/2011

40

Ghi chú: Trong mệnh đề select của hai câu LINQ trên, tôi sử dụng OrderDate.ToShortDateString() chỉ có mục đích hiển thị kết quả gọn hơn. Bạn không nên dùng khi làm các ví dụ khác vì dữ liệu trả về sẽ có kiểu không phù hợp.Như bạn thấy hai dòng cuối cùng là sản phẩm Adroid và Chromium OS có cùng giá trị OrderDate. Điều này có nghĩa là chúng nằm trong cùng một hóa đơn (có mã là 102).

yinyangit.wordpress.com

 Chia sẻ qua: 
Hot!
Ý kiến bạn đọc

These items will be permanently deleted and cannot be recovered. Are you sure?

Gallery

image

Maecenas viverra rutrum pulvinar

Maecenas viverra rutrum pulvinar! Aenean vehicula nulla sit amet metus aliquam et malesuada risus aliquet. Vestibulum rhoncus, dolor sit amet venenatis porta, metus purus sagittis nisl, sodales volutpat elit lorem…

Read more

Text Links

Thiết kế logo chuyên nghiệp Insky
DAFABET
W88 w88b.com/dang-ky-tai-khoan-w88
W88
Copyright © 2011 - 2012 vietshare.vn by phamkhuong102@gmail.com doanhkisi2315@gmail.com. All rights reserved.