ASP.NET MVC 5 LinQ to SQL

ASP.NET MVC 5 LinQ to SQL

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

ASP.NET MVC 5 LinQ to SQLASP.NET MVC 5 LinQ to SQLASP.NET MVC 5 LinQ to SQLASP.NET MVC 5 LinQ to SQL

ASP.NET MVC 5 LinQ to SQL

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>

ASP.NET MVC 5 LinQ to SQL

Điều gì đã xảy ra, ta đâu có liên kết giữa table NHANVIEN 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    

Tag: ASP.NET MVC