LTUDQL 2
©HCMUS.
LINQ to SQL
• Là kỹ thuật ORM (Object Relation Mapping) của Microsoft dùng để ánh xạ quan hệ CSDL sang quan hệ đối tượng.
• Giúp cho việc lập trình giao tiếp CSDL dễ dàng hơn.
• Hỗ trợ những thao tác cơ sở dữ liệu: thêm, xóa, sửa, cập nhật
• Hỗ trợ transaction, view, stored procedure
- 2 -
LTUDQL 2
©HCMUS.
Các bước thao tác CSDL với LINQ to SQL
• Kết nối đến loại CSDL mà LINQ to SQL hỗ trợ
• Thực hiện ánh xạ ORM (tạo file <TenCSDL>.dbml). Ví dụ: TruongHoc.dbml
• Khởi tạo đối tượng CSDL đã ánh xạ (đối tượng <TenCSDL><DataContext>). Ví dụ: TruongHocDataContext
• Sử dụng đối tượng CSDL trên để thao tác CSDL
- 3 -
LTUDQL 2
©HCMUS.
Loại CSDL LINQ to SQL hỗ trợ
• Chỉ hỗ trợ các loại CSDL sau:• Microsoft SQL Server
• Microsoft SQL Server Compact (*.sdf)
• Microsft SQL Server Database File (*.mdf)
• Lưu ý: Khi tạo report với Crystal Report, Crystal Report chỉ hỗ trợ Microsoft SQL Server, không kết nối trưc tiếp được với *.sdf và *.mdf
- 4 -
LTUDQL 2
©HCMUS.
Thực hiện ánh xạ ORM
• Tạo file TenCSDL.dbml
• Kéo tất cả các bảng vào cửa sổ Design
• Có thể kéo các View, Stored Procedure, Function vào cửa sổ Design
• Lưu ý khi đã thực hiện ánh xạ trong project sẽ xuất hiện file app.config. Trong file này chứa chuỗi connectionstring. Khi đem ứng dụng qua máy khác chạy ta chỉ cần chỉnh sửa giá trị chuỗi connectionstring trong file này.
- 5 -
LTUDQL 2
©HCMUS.
Khởi tạo đối tượng CSDL đã ánh xạ
‘1.Su dung gia tri chuoi connectionstring trong file app.configDim db As New TruongHocDataContext()
‘2.Khong su dung gia tri chuoi connectionstring trong file app.configDim cnStr As StringcnStr = “..”Dim db As New TruongHocDataContext(cnStr)
- 6 -
LTUDQL 2
©HCMUS.
Truy vấn dữ liệu không điều kiện
Public Function LayDanhSachKhachHang() As List(Of Customer) Dim db As New NorthwindDataContext() Dim query = From c In db.Customers Select c Return query.ToList()End Function
- 7 -
LTUDQL 2
©HCMUS.
Truy vấn dữ liệu có điều kiện
Public Function LayDanhSachKhachHangTheoThanhPho _(ByVal tp As String) As List(Of Customer) Dim db As New NorthwindDataContext() Dim query = From c In db.Customers Where c.City = tp Select c Return query.ToList()End Function
- 8 -
LTUDQL 2
©HCMUS.
Truy vấn dữ liệu – Kiểu trả về không xác định (Anonymous Type)
Public Function LayDanhThongTinKhachHang() As IList Dim db As New NorthwindDataContext() Dim query = From c In db.Customers Select c.ContactName, c.Phone Return query.ToList()End Function
- 9 -
LTUDQL 2
©HCMUS.
Truy vấn dữ liệu – Kiểu trả về xác định
Public Function LayDanhThongTinKhachHang1() As List(Of ThongTinKhachHang) Dim db As New NorthwindDataContext() Dim query = From c In db.Customers Select New ThongTinKhachHang With {.ContactName = c.ContactName, .Phone = c.Phone} Return query.ToList()End Function
• Phải định nghĩa lớp ThongTinKhachHang có thuộc tính ContactName và Phone
- 10 -
LTUDQL 2
©HCMUS.
Truy vấn dữ liệu với distinct
Public Function LayDanhSachThanhPho() As List(Of String) Dim db As New NorthwindDataContext() Dim query = From c In db.Customers Select c.City Distinct Return query.ToList()End Function
- 11 -
LTUDQL 2
©HCMUS.
Truy vấn với điều kiện AndAlso, OrElse
Dim q = From p In db.Products Where p.UnitsInStock <= p.ReorderLevel AndAlso Not p.Discontinued Select p
Dim q = From p In db.Products _ Where p.UnitPrice > 10.0# OrElse p.Discontinued Select p
- 12 -
LTUDQL 2
©HCMUS.
Truy vấn dòng đầu tiên
Dim shipper As Shippershipper = db.Shippers.First()
Dim cust = From c In db.CustomersWhere c.CustomerID = "BONAP" Take 1
Dim ord = (From o In db.Orders Where o.Freight > 10DSelect o).First()
- 13 -
LTUDQL 2
©HCMUS.
Insert 1 dòng dữ liệu
Dim newCustomer = New Customer With {.CustomerID = "MCSFT", .CompanyName = "Microsoft", .ContactName = "John Doe", .ContactTitle = "Sales Manager", .Address = "1 Microsoft Way", .City = "Redmond", .Region = "WA", .PostalCode = "98052", .Country = "USA", .Phone = "(425) 555-1234", .Fax = Nothing}
db.Customers.InsertOnSubmit(newCustomer)db.SubmitChanges()
- 14 -
LTUDQL 2
©HCMUS.
Insert 1 dòng dữ liệu 1-many
Dim newCategory = New Category With {.CategoryName = "Widgets", .Description = "Widgets are the customer-facing analogues " & "to sprockets and cogs."}
Dim newProduct = New Product With {.ProductName = "Blue Widget",.UnitPrice = 34.56#,.Category = newCategory} db.Categories.InsertOnSubmit(newCategory)db.SubmitChanges()
- 15 -
LTUDQL 2
©HCMUS.
Insert 1 dòng dữ liệu many - many
Dim newEmployee = New Employee With {.FirstName = "Kira", .LastName = "Smith"}
Dim newTerritory = New Territory With {.TerritoryID = "12345", .TerritoryDescription = "Anytown", .Region = db.Regions.First()}
Dim newEmployeeTerritory = New EmployeeTerritory With{.Employee = newEmployee, .Territory = newTerritory}
db.Employees.InsertOnSubmit(newEmployee)db.Territories.InsertOnSubmit(newTerritory) db.EmployeeTerritories.InsetOnSubmit(newEmployeeTerritory)db.SubmitChanges() - 16 -
LTUDQL 2
©HCMUS.
Update 1 dòng dữ liệu
Dim cust As Customercust = (From c In db.Customers Where c.CustomerID = "ALFKI" Select c).First()
cust.ContactTitle = "Vice President"db.SubmitChanges()
- 17 -
LTUDQL 2
©HCMUS.
Update nhiều dòng dữ liệu
Dim query = From p In db.Products _ Where CInt(p.CategoryID.Value) = 1 Select p Dim lst As List (of Product) lst = query.ToList() For Each item As Product In lst item.UnitPrice += 1.0 Next
db.SubmitChanges()
- 18 -
LTUDQL 2
©HCMUS.
Delete một dòng dữ liệu
Dim order As Order_Detail order = (From c In db.Order_Details _ Where c.OrderID = 10255 AndAlso c.ProductID = 36 Select c).First()
db.Order_Details.DeleteOnSubmit(order) db.SubmitChanges()
- 19 -
LTUDQL 2
©HCMUS.
Delete nhiều dòng dữ liệu
Dim orderDetails = _ From o In db.Order_Details _ Where o.Order.CustomerID = "WARTH" AndAlso o.Order.EmployeeID = 3 Select o
Dim order = _ (From o In db.Orders _ Where o.CustomerID = "WARTH" AndAlso o.EmployeeID = 3 _ Select o).First()
For Each od As Order_Detail In orderDetails db.Order_Details.DeleteOnSubmit(od) Next
db.Orders.DeleteOnSubmit(order) db.SubmitChanges()
- 20 -
LTUDQL 2
©HCMUS.
Dùng các stored procedure
'Retrieve products based on adhoc queryDim products As IEnumerable(Of Product)products = From p In db.Products Where p.CategoryID = 1 Select p'Retrieve products instead using a SPROC methodproducts = db.GetProductsByCategory(1)'iterate over resultFor Each item As Product In products '....Next
- 21 -
LTUDQL 2
©HCMUS.
Phân trang truy vấn kết quả
Public Function LaySanPham(ByVal startRow As Integer) As IEnumerable(Of Product) Dim db As New NorthwindDataContext() 'Retrieve products based on adhoc query Dim products As IEnumerable(Of Product) products = From p In db.Products Where p.CategoryID = 1 Select p Return products.Skip(startRow).Take(10)End Function
- 22 -
LTUDQL 2
©HCMUS.
Kết bảng (join)
Public Function TimKiemHocSinhTheoTenLop(ByVal tenLop As String) As List (Of HocSinh) Dim db As New TruongHocDataContext() Dim query = From hs In db.HocSinhs Join lh In db.LopHocs On hs.MaLop Equals lh.Ma Where lh.Ten = tenLop Select hs Return query.ToList()End Function
- 23 -
LTUDQL 2
©HCMUS.
Tham khảo thêm
• http://msdn.microsoft.com/en-us/vbasic/bb688085
• Project SampleQueries (LinQToSQLSamples.vb)
- 24 -
LTUDQL 2
©HCMUS.
Câu hỏi?
- 25 -