Hôm này mình đi qua bài viết chia sẻ về các câu lệnh thực thi trong LinQ to SQL, LinQ được sử dụng nhiều trong C# và ASP.NET, mình nghĩ chắc mọi người điều biết dù ít hay nhiều về câu lệnh LinQ này rồi.
Trong bài chia sẻ này mình làm một vài Ví dụ cơ bản về LinQ, để bài tiếp theo ta có thể dùng cho thoải mái xíu ::)
Chuẩn bị:
- Tạo Project BasicLinQ
- Install EntityFramework
- Intall Bootstrap, bạn có thể xem lại bài ASP.NET MVC 5 Install Bootstrap để cấu hình và cài đặt plugin nhé
- Import database dữ liệu vào SQL SERVER 2012 hoặc tùy mọi người, để hồi ta import database vào project của ta
Sau khi cài đặt xong bạn import database đến projet BasicLinQ như hình dưới đây
Nếu bạn import ok rồi thì bạn tạo cho mình file HomeController.cs trong thư mục BasicLinQ/Controllers
Đầu tiên bạn cần thêm 2 đoạn code dưới đây vào file HomeController.cs vừa tạo
+ using BasicLinQ.Models; + private QLTSEntities _db = new QLTSEntities();
HomeControllers.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using BasicLinQ.Models; namespace BasicLinQ.Controllers { public class HomeController : Controller { private QLTSEntities _db = new QLTSEntities(); // GET: Home public ActionResult Index() { return View(); } } }
Vậy là xong, giờ ta thử nghiệm một vài câu lệnh LinQ thôi nào, mà mình nói thật LinQ nó rất thông mình đấy nhé mọi người
Example 1: Lấy tất cả danh sách nhân viên trong table Nhanvien như sau:
//HomeController.cs
public ActionResult Index() { //TH1: var nhanvien = (from s in _db.NHANVIENs select s).ToList(); ViewBag.nhanviens = nhanvien; //TH2: //var nhanvien = _db.NHANVIENs.ToList(); //ViewBag.nhanviens = nhanvien; return View(); }
//Index.cshtml
<table class="table table-bordered"> <thead> <tr> <th>MANV</th> <th>TENNV</th> <th>TENDV</th> </tr> </thead> <tbody> @foreach (var item in ViewBag.nhanviens) { <tr> <td>@item.MaNV</td> <td>@item.TenNV</td> <td>@item.DONVI.TenDV</td> </tr> } </tbody> </table>
Điều gì đã xảy ra, ta đâu có liên kết giữa table NHANVIEN và DONVI, sao ta lại lấy được TenDV, đó chính là điều mình cần nói, LinQ đã hổ trợ cho ta, nó ánh xạ giữa các table với nhau, bạn có thể nhìn Models NHANVIEN.cs đưới đây, nó được tạo ra như sau:
public partial class NHANVIEN { [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] public NHANVIEN() { this.SOMUONs = new HashSet<SOMUON>(); } public string MaNV { get; set; } public string TenNV { get; set; } public string Diachi { get; set; } public string Dienthoai { get; set; } public string MaDV { get; set; } public virtual DONVI DONVI { get; set; } [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] public virtual ICollection<SOMUON> SOMUONs { get; set; } }
Vì thế bạn có thể trỏ đến đối tượng TenDV. @item.DONVI.TenDV
Example 2: Sắp xếp thứ tự tăng dần(ASC)/giảm dần(DESC)
// sử dụng cú pháp query truy vấn
var nhanvien = (from s in _db.NHANVIENs orderby s.MaNV ascending select s ).ToList(); //OR var nhanvien = (from s in _db.NHANVIENs orderby s.MaNV descending select s ).ToList();
// sử dụng phương thức truy vấn
var nhanvien = _db.NHANVIENs.OrderBy(s => s.MaDV).ToList(); var nhanvien = _db.NHANVIENs.OrderByDescending(s => s.MaDV).ToList();
Example 3:Tìm các nhân viên thuộc đơn vị "KKHCB", ta sẽ liên kết giữa table NHANVIEN & DONVI
var nhanvien = (from s in _db.NHANVIENs where s.DONVI.MaDV == "KKHCB" select s).ToList(); var nhanvien2 = _db.NHANVIENs .Where(s => s.DONVI.MaDV.Contains("KKHCB")) .ToList(); ViewBag.nhanviens = nhanvien; ViewBag.nhanviens2 = nhanvien2; return View();
Examle 4: Thêm một nhân viên thuộc đơn vị(DONVI) "KHCB"
public ActionResult Store(NHANVIEN _nv) { _nv.TenNV = "Ts.Lưu Văn Thành"; _nv.Diachi = "HCM"; _nv.Dienthoai = "0123456789"; _nv.MaDV = "KKHCB"; _db.NHANVIENs.Add(_nv); _db.SaveChanges(); return RedirectToAction("Index"); }
Trên là một ví dụ mẫu thôi, bình thường thì bạn dùng form để gửi data đến function Store để xử lý nhé, nếu bạn dùng form thì chỉ cần nhập đủ các trường, sao đó chỉ cần dùng 2 cầu lệnh dưới đây để thêm
_db.NHANVIENs.Add(_nv); _db.SaveChanges();
Example 5: Cập nhật nhân viên MaNV="KHCB003"
NHANVIEN _nv = _db.NHANVIENs.Where(s => s.MaNV.Equals("KHCB003")).FirstOrDefault(); _nv.TenNV = "update ten"; _db.SaveChanges(); //OR NHANVIEN _nv = _db.NHANVIENs.Single(s => s.MaNV == "KHCB003"); _nv.TenNV = "update ten 2"; _db.SaveChanges();
Example 6: Xóa nhân viên MaNV="KHCB003"
var delete = _db.NHANVIENs.Where(s => s.MaNV.Equals("KHCB003")).FirstOrDefault(); _db.NHANVIENs.Remove(delete); _db.SaveChanges(); //or var delete2 = (from s in _db.NHANVIENs where s.MaNV == "KHCB003" select s).First(); _db.NHANVIENs.Remove(delete2); _db.SaveChanges();
Example 7: Thống kê tổng số nhân viên của từng đơn vị(DONVI)
SQL: select a.TenDV, b.TS from DONVI a, (select MaDV, COUNT(MaDV) TS from NHANVIEN b group by b.MaDV) b where a.MaDV=b.MaDV SQL: select a.TenDV, COUNT(b.MaDV) AS TL from DONVI a, NHANVIEN b where a.MaDV= b.MaDV group by a.TenDV,b.MaDV
LinQ:
var donvi = _db.DONVIs.GroupBy(s => s.MaDV) .Select(g => new { g.FirstOrDefault().TenDV, g.FirstOrDefault().NHANVIENs.Count }); var donvi = from s in _db.DONVIs group s by s.MaDV into g select new { TenDV = g.FirstOrDefault().TenDV, TL = g.FirstOrDefault().NHANVIENs.Count };
Example 8: chúng ta thống kê tài sản thuộc đơn vị nào, và đơn vị đó sử dụng số lượng bao nhiêu
var taisan = from s in _db.TAISANs from x in _db.GIATRITAISANs from y in _db.DONVITAISANs from z in _db.DONVIs where s.MaTS==x.MaTS where y.MaTS==s.MaTS where z.MaDV == y.MaDV select new { TenTS = s.TenTS, SoLuong = s.GIATRITAISANs.FirstOrDefault().Soluong, TenDV = (s.DONVITAISANs.FirstOrDefault()).DONVI.TenDV, SoLuongDV = s.DONVITAISANs.FirstOrDefault().Soluong, ConLai = (s.GIATRITAISANs.FirstOrDefault().Soluong - s.DONVITAISANs.FirstOrDefault().Soluong) };
//OR
var taisan = from s in _db.TAISANs join x in _db.GIATRITAISANs on s.MaTS equals x.MaTS join y in _db.DONVITAISANs on s.MaTS equals y.MaTS join z in _db.DONVIs on y.MaDV equals z.MaDV select new { TenTS = s.TenTS, SoLuong = x.Soluong, TenDV = z.TenDV, SoLuongDV = y.Soluong, ConLai = (x.Soluong - y.Soluong) };
Example 9: thống kê đơn vị có những tài sản nào
SQL:
select a.TenDV, count(b.MaDV) as Total from DONVI a,DONVITAISAN b where a.MaDV=b.MaDV group by a.TenDV
LinQ:
var taisan = from s in _db.DONVIs join x in _db.DONVITAISANs on s.MaDV equals x.MaDV group s by s.MaDV into g select new { TenDV = g.FirstOrDefault().TenDV, Total = g.FirstOrDefault().DONVITAISANs.Count() }; var taisan = from s in _db.DONVIs join x in _db.DONVITAISANs on s.MaDV equals x.MaDV group s by s.MaDV into g select new { TenDV = g.FirstOrDefault().TenDV, Total = g.Count() };
Example 10: Liệt kê danh sách tài sản theo năm tháng
var taisan = from s in _db.TAISANs where (s.Namsx >= new DateTime(2014, 01, 01) && s.Namsx <= new DateTime(2014, 05, 01)) select new { s.TenTS, s.Namsx };
Đi qua sơ sơ vậy, ta cũng hiểu được LinQ nó thông minh qua, giúp ta ít tốn code viết câu lệnh truy vấn, LinQ quá thông minh