tỔng hỢp cÁc cÂu truy vẤn linq

14
TỔNG HỢP CÁC CÂU TRUY VẤN LINQ Để giúp các bạn học tốt cũng như hiểu và làm được các câu truy vấn LINQ to SQL mình nên úp lên các câu truy vấn của của tiểu luần môn học Hệ cơ sở dữ liệu nâng cao mà mình làm. Đây là một bài rất hay, đủ thứ loại câu truy vấn từ dễ đến khó, hi vọng sẻ giúp ích cho các bạn. Nếu siêng năng một tý thì chắc chắn tuần sau sẻ có nhiều bạn được thầy cộng điểm. Một số câu do mới bắt đầu làm nên code có vẻ dài dòng, về sau biết rút gọn lại nhưng làm biếng quá. Bạn nào có cách làm ngắn gọn hơn thì góp ý để cho mọi người cùng học hỏi. Còn đây là mô hình cơ sở dữ liệu. I.Phần truy vấn dữ liệu (Select) 1 Cho biết danh sách các đối tác cung cấp hàng cho công ty. GiaoTrinhDataDataContext context = new GiaoTrinhDataDataContext(); gvKetQua.DataSource = context.NHACUNGCAPs; 2 hàng, tên hàng số lượng của các mặt hàng hiện trong công ty. GiaoTrinhDataDataContext contex = new GiaoTrinhDataDataContext(); gvKetQua.DataSource = contex.MATHANGs.Select(c => new { MaHang = c.MAHANG, TenHang = c.TENHANG, SoLuong = c.SOLUONG }); 3 Họ tên địa chỉ năm bắt đầu làm việc của các nhân viên trong công ty. GiaoTrinhDataDataContext context = new GiaoTrinhDataDataContext(); gvKetQua.DataSource = context.NHANVIENs.Select(c=> new { Ho = c.HO, Ten = c.TEN, DiaChi = c.DIACHI, NamBatDau = c.NGAYLAMVIEC.Value.Year// Năm làm việc }); 4 Địa chỉ điện thoại của nhà cung cấp tên giao dịch VINAMILK gì?

Upload: duong-tien-lam

Post on 28-Nov-2015

250 views

Category:

Documents


6 download

DESCRIPTION

TỔNG HỢP CÁC CÂU TRUY VẤN LINQ

TRANSCRIPT

Page 1: TỔNG HỢP CÁC CÂU TRUY VẤN LINQ

TỔNG HỢP CÁC CÂU TRUY VẤN LINQ

Để giúp các bạn học tốt cũng như hiểu và làm được các câu truy vấn LINQ to SQL mình nên úp lên các

câu truy vấn của của tiểu luần môn học Hệ cơ sở dữ liệu nâng cao mà mình làm. Đây là một bài rất hay, đủ

thứ loại câu truy vấn từ dễ đến khó, hi vọng sẻ giúp ích cho các bạn. Nếu siêng năng một tý thì chắc chắn

tuần sau sẻ có nhiều bạn được thầy cộng điểm.

Một số câu do mới bắt đầu làm nên code có vẻ dài dòng, về sau biết rút gọn lại nhưng làm biếng quá. Bạn

nào có cách làm ngắn gọn hơn thì góp ý để cho mọi người cùng học hỏi.

Còn đây là mô hình cơ sở dữ liệu.

I.Phần truy vấn dữ liệu (Select)

1 Cho biết danh sách các đối tác cung cấp hàng cho công ty.

GiaoTrinhDataDataContext context = new

GiaoTrinhDataDataContext(); gvKetQua.DataSource =

context.NHACUNGCAPs;

2 Mã hàng, tên hàng và số lượng của các mặt hàng hiện có trong công ty.

GiaoTrinhDataDataContext contex = new GiaoTrinhDataDataContext();

gvKetQua.DataSource = contex.MATHANGs.Select(c => new { MaHang =

c.MAHANG, TenHang = c.TENHANG, SoLuong = c.SOLUONG });

3 Họ tên và địa chỉ và năm bắt đầu làm việc của các nhân viên trong công ty.

GiaoTrinhDataDataContext context = new

GiaoTrinhDataDataContext(); gvKetQua.DataSource =

context.NHANVIENs.Select(c=> new { Ho = c.HO, Ten = c.TEN, DiaChi

= c.DIACHI, NamBatDau = c.NGAYLAMVIEC.Value.Year// Năm làm việc

});

4 Địa chỉ và điện thoại của nhà cung cấp có tên giao dịch VINAMILK là gì?

Page 2: TỔNG HỢP CÁC CÂU TRUY VẤN LINQ

GiaoTrinhDataDataContext context = new

GiaoTrinhDataDataContext(); gvKetQua.DataSource =

context.NHACUNGCAPs.Where(c => c.TENGIAODICH ==

"VINAMILK").Select(c => new { DiaChi = c.DIACHI, DienThoai =

c.DIENTHOAI });

5 Cho biết mã và tên của các mặt hàng có giá lớn hơn 100000 và số lượng hiện có ít hơn 50

GiaoTrinhDataDataContext context = new

GiaoTrinhDataDataContext(); gvKetQua.DataSource =

context.MATHANGs.Where(c => c.SOLUONG < 50 && c.GIAHANG <

100000).Select(d=>new { MaHang=d.MAHANG, TenHang = d.TENHANG });

6 Cho biết mỗi mặt hàng trong công ty do ai cung cấp.

GiaoTrinhDataDataContext context = new

GiaoTrinhDataDataContext(); gvKetQua.DataSource =

context.MATHANGs.Select(c => new { MaHang = c.MAHANG, TenHang =

c.TENHANG, NhaCungCap = c.NHACUNGCAP.TENCONGTY });

7 Công ty Việt Tiến đã cung cấp những mặt hàng nào?

GiaoTrinhDataDataContext context = new

GiaoTrinhDataDataContext(); gvKetQua.DataSource =

context.MATHANGs.Where(c => c.NHACUNGCAP.TENCONGTY == "Công ty

Việt Tiến").Select(v => new { v.MAHANG, v.LOAIHANG.TENLOAIHANG,

v.GIAHANG, v.DONVITINH, v.SOLUONG });

8 Loại hàng thực phẩm do những công ty nào cung cấp và địa chỉ của các công ty đó là gì?

GiaoTrinhDataDataContext db = new GiaoTrinhDataDataContext(); var

table = db.MATHANGs.Where(c => c.LOAIHANG.TENLOAIHANG == "Thực

phẩm")//Lọc ra những loại hàng thực phẩm .Join(db.NHACUNGCAPs, a

=> a.MACONGTY, b => b.MACONGTY, (a, b) => new { TenCongTy =

b.TENCONGTY, DiaChi = b.DIACHI }).Distinct();//Loại bỏ kết quả

trùng lặp gvKetQua.DataSource = table;

9 Những khách hàng nào (tên giao dịch) đã đặt mua mặt hàng Sữa hộp XYZ của công ty?

GiaoTrinhDataDataContext db = new GiaoTrinhDataDataContext();

var table = from kh in db.KHACHHANGs join dh in db.DONDATHANGs on

kh.MAKHACHHANG equals dh.MAKHACHHANG//Nối hai bảng Khách Hàng và

Page 3: TỔNG HỢP CÁC CÂU TRUY VẤN LINQ

Đơn đặt hàng join ct in db.CHITIETDATHANGs.Where(x =>

x.MATHANG.TENHANG == "sữa hộp XYZ")//Nối tiếp với bảng Chi tiết

đặt hàng đã được lọc mặt hàng có tên là "sữa hộp XYZ" on

dh.SOHOADON equals ct.SOHOADON select new { TenGiaoDich =

kh.TENGIAODICH//Lấy tên giao dịch của khách hàng };

gvKetQua.DataSource = table;

10 Đơn đặt hàng số 1 do ai đặt và do nhân viên nào lập, thời gian và địa điểm giao hàng là

ở đâu?

GiaoTrinhDataDataContext db = new GiaoTrinhDataDataContext(); var

table = from dh in db.DONDATHANGs where dh.SOHOADON == 1 select

new { KhachHang = dh.KHACHHANG.TENCONGTY, NhanVienLap =

dh.NHANVIEN.HO + " " + dh.NHANVIEN.TEN, NgayGiao =

dh.NGAYGIAOHANG, DiaDiem = dh.NOIGIAOHANG }; gvKetQua.DataSource

= table;

11. Hãy cho biết số tiền lương mà công ty phải trả cho mỗi nhân viên là bao nhiêu

(lương = lương cơ bản + phụ cấp).

GiaoTrinhDataDataContext db = new GiaoTrinhDataDataContext(); var

table = from nv in db.NHANVIENs select new { TenNhanVien = nv.HO

+ " " + nv.TEN, NgaySinh = nv.NGAYSINH, DiaChi = nv.DIACHI,

DienThoai = nv.DIENTHOAI, Luong =

((float)nv.LUONGCOBAN==null?0:(float)nv.LUONGCOBAN +

nv.PHUCAP==null?0:nv.PHUCAP)//xxx=null?X:Y xxx=null là điều

kiên, đúng nhận giá trị X sai là giá trị Y };

gvKetQua.DataSource = table;

12 Trong đơn đặt hàng số 3 đặt mua những mặt hàng nào và số tiền mà khách hàng phải trả

cho mỗi mặt hàng là bao nh iêu (số tiền phải trả được tính theo công thức

SOLUONG×GIABAN – SOLUONG×GIABAN×MUCGIAMGIA/100)

GiaoTrinhDataDataContext db = new GiaoTrinhDataDataContext();

var table = from ct in db.CHITIETDATHANGs where ct.SOHOADON == 3

select new { ct.MAHANG, ct.SOLUONG, GIABAN= string.Format("{0:0,0

NVĐ}", ct.GIABAN), ct.MUCGIAMGIA, TongTien =string.Format("{0:0,0

VNĐ}", ((float)ct.SOLUONG * (float)ct.GIABAN - (float)ct.SOLUONG

* (float)ct.GIABAN * (float)ct.MUCGIAMGIA)) };

gvKetQua.DataSource = table;

13 Hãy cho biết có những khách hàng nào lại chính là đối tác cung cấp hàng của

công ty (tức là có cùng tên giao dịch).

Page 4: TỔNG HỢP CÁC CÂU TRUY VẤN LINQ

GiaoTrinhDataDataContext db = new GiaoTrinhDataDataContext(); var

table = from kh in db.KHACHHANGs where (from kh2 in

db.NHACUNGCAPs select new { kh2.TENGIAODICH }).Contains(new {

TENGIAODICH = kh.TENGIAODICH }) select kh; gvKetQua.DataSource =

table;

14 Trong công ty có những nhân viên nào có cùng ngày sinh?

GiaoTrinhDataDataContext db = new GiaoTrinhDataDataContext(); var

table = (from nv in db.NHANVIENs join tmp in (from nv in

db.NHANVIENs group nv by nv.NGAYSINH into g //gom nhóm những nhân

viên trùng ngày sinh where g.Count() > 1 //nhóm có trên 2 nhân

viên mới được chọn select new { NgaySinh = g.Key }) on

nv.NGAYSINH equals tmp.NgaySinh//Nối với bảng nhân viên select

nv).OrderBy(c => c.NGAYSINH).ToList();//Sắp xếp tăng dần theo

ngày sinh gvKetQua.DataSource = table;

15 Những đơn đặt hàng nào yêu cầu giao hàng ngay tại công ty đặt hàng và những đơn đó là

của công ty nào?

GiaoTrinhDataDataContext db = new GiaoTrinhDataDataContext(); var

table = from h in db.KHACHHANGs join d in db.DONDATHANGs on

h.MAKHACHHANG equals d.MAKHACHHANG//nối hai bảng lại where

h.DIACHI == d.NOIGIAOHANG //Điều kiên lọc là địa chỉ trùng với

noi giao hàng select new { SoHoaDon = d.SOHOADON, KhacHang =

h.TENCONGTY, TenGiaoDich = h.TENGIAODICH, DiaChi = h.DIACHI,

NoiGiaoHang = d.NOIGIAOHANG }; gvKetQua.DataSource = table;

16 Cho biết tên công ty, tên giao dịch, địa chỉ và điện thoại của các khách hàng và các nhà

cung cấp hàng cho công ty.

GiaoTrinhDataDataContext db = new GiaoTrinhDataDataContext(); var

ncc = db.NHACUNGCAPs.Select(a => new { TenCongTy = a.TENCONGTY,

TenGiaoDich = a.TENGIAODICH, DiaChi = a.DIACHI, DienThoai =

a.DIENTHOAI }); var kh = db.KHACHHANGs.Select(a => new {

TenCongTy = a.TENCONGTY, TenGiaoDich = a.TENGIAODICH, DiaChi =

a.DIACHI, DienThoai = a.DIENTHOAI }); var KH_NCC =

ncc.Concat(kh); gvKetQua.DataSource = KH_NCC;

17 Những mặt hàng nào chưa từng được khách hàng đặt mua?

GiaoTrinhDataDataContext db = new GiaoTrinhDataDataContext(); var

table = from mh in db.MATHANGs where !(from CHITIETDATHANGs in

Page 5: TỔNG HỢP CÁC CÂU TRUY VẤN LINQ

db.CHITIETDATHANGs select new { CHITIETDATHANGs.MAHANG

}).Contains(new { MAHANG = mh.MAHANG }) select new { MaHang =

mh.MAHANG, TenHang = mh.TENHANG, MaCongTy = mh.MACONGTY,

MaLoaiHang = mh.MALOAIHANG, SoLuong = mh.SOLUONG, DonViTinh =

mh.DONVITINH, GiaHang = mh.GIAHANG }; gvKetQua.DataSource =

table;

18 Những nhân viên nào của công ty chưa từng lập bất kỳ một hoá đơn đặt hàng nào?

GiaoTrinhDataDataContext db = new GiaoTrinhDataDataContext(); var

table = from nv in db.NHANVIENs where !(from hd in db.DONDATHANGs

select new { hd.MANHANVIEN }).Contains(new { MANHANVIEN =

nv.MANHANVIEN }) select new { MaNhanVien = nv.MANHANVIEN, Ho =

nv.HO, Ten = nv.TEN, NgaySinh = nv.NGAYSINH, NgayLamViec =

nv.NGAYLAMVIEC, DiaChi = nv.DIACHI, DienThoai = nv.DIENTHOAI,

LuongCoBan = nv.LUONGCOBAN, PhuCap = nv.PHUCAP };

gvKetQua.DataSource = table;

19 Những nhân viên nào của công ty có lương cơ bản cao nhất?

GiaoTrinhDataDataContext db = new GiaoTrinhDataDataContext(); var

table = from n in db.NHANVIENs where n.LUONGCOBAN == ((from nv in

db.NHANVIENs group nv by nv.LUONGCOBAN into g select g).Max(a =>

a.Key))//Lấy lương cơ bản cao nhất select n; gvKetQua.DataSource

= table;

20 Tổng số tiền mà khách hàng phải trả cho mỗi đơn đặt hàng là bao nhiêu?

GiaoTrinhDataDataContext db = new GiaoTrinhDataDataContext(); var

table = from dh in db.DONDATHANGs select new { dh.SOHOADON,

dh.KHACHHANG.TENCONGTY, TongTien = string.Format("{0:0,0} VNĐ",

dh.CHITIETDATHANGs .Sum((t => (float)t.SOLUONG * (float)t.GIABAN

- ((float)t.SOLUONG * (float)t.GIABAN * (float)t.MUCGIAMGIA))))

}; gvKetQua.DataSource = table;

21 Trong năm 2003, những mặt hàng nào chỉ được đặt mua đúng một lần.

GiaoTrinhDataDataContext db = new GiaoTrinhDataDataContext(); var

table = from mh in (from ct in db.CHITIETDATHANGs where

ct.DONDATHANG.NGAYDATHANG.Value.Year == 2003 select ct)//Chọn

nhưng đơn đặt hàng có năm là 2003 group mh by mh.MAHANG into

g//Nhóng theo Mã hàng where g.Count() == 1 select new { MaHang =

Page 6: TỔNG HỢP CÁC CÂU TRUY VẤN LINQ

g.Key, TenHang = db.MATHANGs.Single(a=>a.MAHANG==g.Key).TENHANG

}; gvKetQua.DataSource = table;

22 Hãy cho biết mỗi một khách hàng đã phải bỏ ra bao nhiêu tiền để đặt mua hàng

của công ty?

GiaoTrinhDataDataContext db = new GiaoTrinhDataDataContext(); var

table = (from ct in db.CHITIETDATHANGs join dh in db.DONDATHANGs

on ct.SOHOADON equals dh.SOHOADON select new { dh.MAKHACHHANG,

ct.SOHOADON, ct.SOLUONG, ct.GIABAN, ct.MUCGIAMGIA, ct.MAHANG

}).GroupBy(a => a.MAKHACHHANG).Select(b => new { MaKhacHang=

b.Key, TenKhachHang =

db.KHACHHANGs.Single(d=>d.MAKHACHHANG==b.Key).TENCONGTY,

TongTienHangPhaiTra = (float)b.Sum(d => d.GIABAN * d.SOLUONG-

d.SOLUONG*d.GIABAN*(decimal)d.MUCGIAMGIA) });

gvKetQua.DataSource = table.ToList();

23 Mỗi một nhân viên của công ty đã lập bao nhiêu đơn đặt hàng (nếu nhân viên

chưa hề lập một hoá đơn nào thì cho kết quả là 0)

GiaoTrinhDataDataContext db = new GiaoTrinhDataDataContext(); var

table = from nv in db.NHANVIENs select new { MaNhaVien =

nv.MANHANVIEN, TenNhanVien = nv.HO + " " + nv.TEN, NgaySinh =

nv.NGAYSINH, SoDonDatHangDaLap = nv.DONDATHANGs.Count };

gvKetQua.DataSource = table;

24 Cho biết tổng số tiền hàng mà cửa hàng thu được trong mỗi tháng của năm 2003

(thời được gian tính theo ngày đặt hàng).

GiaoTrinhDataDataContext db = new GiaoTrinhDataDataContext(); var

table = from dh in db.DONDATHANGs where dh.NGAYDATHANG.Value.Year

== 2003 group dh by dh.NGAYDATHANG.Value.Month into g select new

{ Thang = g.Key, TongTien =(float)g.Sum(c =>

c.CHITIETDATHANGs.Sum(d => d.GIABAN * d.SOLUONG - d.SOLUONG *

d.GIABAN * (decimal)d.MUCGIAMGIA)) }; gvKetQua.DataSource =

table;

25 Hãy cho biết tổng số tiền lời mà công ty thu được từ mỗi mặt hàng trong năm 2003

GiaoTrinhDataDataContext db = new GiaoTrinhDataDataContext(); var

table = from ct in db.CHITIETDATHANGs where

ct.DONDATHANG.NGAYDATHANG.Value.Year == 2003 group ct by

ct.MAHANG into g select new { MaMatHang = g.Key, TenMatHang =

Page 7: TỔNG HỢP CÁC CÂU TRUY VẤN LINQ

db.MATHANGs.Single(a=>a.MAHANG==g.Key).TENHANG, TongTien =(float)

g.Sum(a => (a.GIABAN - a.MATHANG.GIAHANG) * a.SOLUONG) };

gvKetQua.DataSource = table;

26 Hãy cho biết tổng số lượng hàng của mỗi mặt hàng mà công ty đã có (tổng số

lượng hàng hiện có và đã bán).

GiaoTrinhDataDataContext db = new GiaoTrinhDataDataContext(); var

table = from mh in db.MATHANGs join ct in db.CHITIETDATHANGs on

mh.MAHANG equals ct.MAHANG into ct_join from ct in

ct_join.DefaultIfEmpty() group new { ct, mh } by new { MaHangCT =

ct.MAHANG, MaHangTon = mh.MAHANG, TenHang = mh.TENHANG,

mh.SOLUONG } into g select new { MaHang = g.Key.MaHangTon,

TenHang = g.Key.TenHang, SoLuongHienCo = g.Key.SOLUONG,

SoLuongDaBan = g.Sum(p => p.ct.SOLUONG == null ? 0 :

p.ct.SOLUONG), TongSoLuong = g.Sum(p => p.ct.SOLUONG == null ? 0

: p.ct.SOLUONG) + g.Key.SOLUONG, }; gvKetQua.DataSource = table;

27 Nhân viên nào của công ty bán được số lượng hàng nhiều nhất và số lượng hàng bán

được của những nhân viên này là bao nhiêu?

GiaoTrinhDataDataContext db = new GiaoTrinhDataDataContext(); var

table =(from ct in db.CHITIETDATHANGs join dh in db.DONDATHANGs

on ct.SOHOADON equals dh.SOHOADON into ct_dh from dh in ct_dh

group new { ct, dh } by new { dh.SOHOADON, dh.MANHANVIEN,

ct.MAHANG, ct.SOLUONG } into g group g by g.Key.MANHANVIEN into

g2//group mã nhân viên để cộng số lượng hàng nhân viên đã bán

select new { MaNhanVien = g2.Key, SoLuong = g2.Sum(p =>

p.Key.SOLUONG) }).GroupBy(a => a.SoLuong)// group số lượng để tìm

các nhân viên có chung số lượng hàng bán .OrderByDescending(d =>

d.Key).Take(1)// Sắp xếp giảm dần để lấy nhóm nhóm nhân viên có

bán được hàng nhiều nhất //.AsEnumerable() .First() .Select(c =>

new { MaNhanVien = c.MaNhanVien, HoNhanVien =

db.NHANVIENs.Single(r=>r.MANHANVIEN==c.MaNhanVien).HO,

TenNhanVien =

db.NHANVIENs.Single(a=>a.MANHANVIEN==c.MaNhanVien).TEN,

TongSoLuongMatHangDaBan = c.SoLuong }).ToList(); //Làm cái câu

này mệt quá! gvKetQua.DataSource = table;

28 Đơn đặt hàng nào có số lượng hàng được đặt mua ít nhất?

GiaoTrinhDataDataContext db = new GiaoTrinhDataDataContext(); var

table = (from ct in db.CHITIETDATHANGs group ct by ct.SOHOADON

Page 8: TỔNG HỢP CÁC CÂU TRUY VẤN LINQ

into g select new { g.Key, TSoLuong = g.Sum(p => p.SOLUONG)

}).GroupBy(c => c.TSoLuong) .OrderBy(c => c.Key) .Take(1)

.First() .Select(c => new { SoHoaDon = c.Key, SoLuongDatMua =

c.TSoLuong }) .ToList(); gvKetQua.DataSource = table;

29 Số tiền nhiều nhất mà mỗi khách hàng đã từng bỏ ra để đặt hàng trong các đơn

đặt hàng là bao nhiêu?

GiaoTrinhDataDataContext db = new GiaoTrinhDataDataContext(); var

table = (from d in db.DONDATHANGs select new { d.SOHOADON,

d.KHACHHANG.TENCONGTY, TongTien = d.CHITIETDATHANGs .GroupBy(a =>

a.SOHOADON) .Select(c => c.Sum(a => (float)a.SOLUONG *

(float)a.GIABAN - (float)a.MUCGIAMGIA * (float)a.SOLUONG *

(float)a.GIABAN)) .First() == null ? 0 : d.CHITIETDATHANGs

.GroupBy(a => a.SOHOADON) .Select(c => c.Sum(a =>

(float)a.SOLUONG * (float)a.GIABAN - (float)a.MUCGIAMGIA *

(float)a.SOLUONG * (float)a.GIABAN)) .First() }).GroupBy(c =>

c.TENCONGTY).Select(d => new { TenCongTy = d.Key, Tien = d.Max(c

=> c.TongTien) }); gvKetQua.DataSource = table;

30 Mỗi một đơn đặt hàng đặt mua những mặt hàng nào và tổng số tiền mà mỗi đơn

đặt hàng phải trả là bao nhiêu? Câu này thì thiết kế giao diện như sau:

Đây là code phần load đơn đặt hàng.

private void LoadDonDatHang() { GiaoTrinhDataDataContext db = new

GiaoTrinhDataDataContext(); var table = from ct in

db.CHITIETDATHANGs group ct by ct.SOHOADON into g select new {

MaHoaDon = g.Key, TongTien = g.Sum(a => (float)a.SOLUONG *

Page 9: TỔNG HỢP CÁC CÂU TRUY VẤN LINQ

(float)a.GIABAN - (float)a.SOLUONG * (float)a.GIABAN *

(float)a.MUCGIAMGIA) }; gv_HoaDon.DataSource = table; double

tongtien = table.Sum(a=>a.TongTien); lblTongTien.Text =

string.Format("{0:0,0 VNĐ}", tongtien); }

Phần Load mặt hàng khi click vào đơn hàng

private void gv_HoaDon_CellClick(object sender,

DataGridViewCellEventArgs e) { GiaoTrinhDataDataContext db = new

GiaoTrinhDataDataContext(); int SoHoaDon = int.Parse(gv_HoaDon[0,

e.RowIndex].Value.ToString()); var table = from mh in

db.CHITIETDATHANGs where mh.SOHOADON == SoHoaDon select new {

MaHang = mh.MAHANG, TenHang = db.MATHANGs.Single(a => a.MAHANG ==

mh.MAHANG).TENHANG, LoaiHang = db.MATHANGs.Single(a => a.MAHANG

== mh.MAHANG).LOAIHANG.TENLOAIHANG, }; gvMatHang.DataSource =

table; groupBox1.Text = "Mặt hàng của đơn đặt hàng " + SoHoaDon;

}

31 Hãy cho biết mỗi một loại hàng bao gồm những mặt hàng nào, tổng số lượng

hàng của mỗi loại và tổng số lượng của tất cả các mặt hàng hiện có trong công ty là

bao nhiêu?

Giao diện thiết kế như sau:

Phần code Load loại hàng lên Datagridview

void Load_LoaiHang() { GiaoTrinhDataDataContext db = new

GiaoTrinhDataDataContext(); var table = from lh in db.LOAIHANGs

select new { MaLoai = lh.MALOAIHANG, TenLoai = lh.TENLOAIHANG,

Page 10: TỔNG HỢP CÁC CÂU TRUY VẤN LINQ

SoLuong = lh.MATHANGs.Sum(a => a.SOLUONG) == null ? 0 :

lh.MATHANGs.Sum(a => a.SOLUONG) }; lblTong.Text

=string.Format("{0:0,0}", table.Sum(a => a.SoLuong))+ " Đơn vị";

gv_LoaiHang.DataSource = table; }

Code show mặt hàng khi click vào loại hàng:

int MaLoai = int.Parse(gv_LoaiHang[0,

e.RowIndex].Value.ToString()); GiaoTrinhDataDataContext db = new

GiaoTrinhDataDataContext(); var table = from mh in db.MATHANGs

where mh.MALOAIHANG == MaLoai select new { mh.MAHANG, mh.TENHANG,

mh.SOLUONG, mh.NHACUNGCAP.TENCONGTY }; groupBox2.Text = "Mặt hàng

của loại hàng - " + gv_LoaiHang[1, e.RowIndex].Value.ToString();

gv_MatHang.DataSource = table;

32 Thống kê xem trong năm 2003, mỗi một mặt hàng trong mỗi tháng và trong cả

năm bán được với số lượng bao nhiêu

Yêu cầu: Kết quả được hiển thị dưới dạng bảng, hai cột cột đầu là mã hàng và

tên hàng, các cột còn lại tương ứng với các tháng từ 1 đến 12 v à cả năm. Như

vậy mỗi dòng trong kết quả cho biết số l ượng hàng bán được mỗi tháng và trong cả

năm của mỗi mặt hàng.

DataTable table = new DataTable(); table.Columns.Add(new

DataColumn("Mã Hàng", typeof(String))); table.Columns.Add(new

DataColumn("Tên Hàng", typeof(String))); table.Columns.Add(new

DataColumn("Tháng 1", typeof(Int32))); table.Columns.Add(new

DataColumn("Tháng 2", typeof(Int32))); table.Columns.Add(new

DataColumn("Tháng 3", typeof(Int32))); table.Columns.Add(new

DataColumn("Tháng 4", typeof(Int32))); table.Columns.Add(new

DataColumn("Tháng 5", typeof(Int32))); table.Columns.Add(new

DataColumn("Tháng 6", typeof(Int32))); table.Columns.Add(new

DataColumn("Tháng 7", typeof(Int32))); table.Columns.Add(new

DataColumn("Tháng 8", typeof(Int32))); table.Columns.Add(new

DataColumn("Tháng 9", typeof(Int32))); table.Columns.Add(new

DataColumn("Tháng 10", typeof(Int32))); table.Columns.Add(new

DataColumn("Tháng 11", typeof(Int32))); table.Columns.Add(new

DataColumn("Tháng 12", typeof(Int32))); table.Columns.Add(new

DataColumn("Cả năm", typeof(Int32))); GiaoTrinhDataDataContext

db = new GiaoTrinhDataDataContext(); var MatHangTemp = (from mh

in db.CHITIETDATHANGs where mh.DONDATHANG.NGAYDATHANG.Value.Year

== 2003 group mh by new{mh.DONDATHANG.NGAYDATHANG.Value.Month,

mh.MAHANG }into g select new { mahang= g.Key.MAHANG, Thang =

g.Key.Month, soluong = g.Sum(a=>a.SOLUONG)

Page 11: TỔNG HỢP CÁC CÂU TRUY VẤN LINQ

}).GroupBy(a=>a.mahang); var MatHang = db.MATHANGs.Select(a =>

new { MaHang = a.MAHANG, TenHang = a.TENHANG

}).OrderBy(c=>c.MaHang); foreach (var mh in MatHang)//Duyệt danh

sách mặt hàng { DataRow dr = table.NewRow();//Tạo một dòng mới

dr[0] = mh.MaHang; dr[1] = mh.TenHang; foreach (var mhtemp in

MatHangTemp)//duyệt danh sách mặt hàng đã được nhóm lại theo

Tháng và Mã Hàng { int ca_nam = 0; if (mhtemp.Key ==

mh.MaHang)//Kiểm tra xem Key của nhóm hàng có trùng với Mã Hàng?

{ foreach (var item in mhtemp)//Duyệt danh sách hàng hóa có trong

nhóm for (int i = 1; i <= 12; i++) { if (item.Thang == i) { dr[i

+ 1] = item.soluong; ca_nam += item.soluong; break; } } dr[14] =

ca_nam; } } table.Rows.Add(dr); } gvKetQua.DataSource = table;

II. Phần cập nhật (Update).

33 Cập nhật lại giá trị trường NGAYCHUYENHANG của những bản ghi có

NGAYCHUYENHANG chưa xác đ ịnh (NULL) trong bảng DONDATHANG

bằng với giá trị của trường NGAYDATHANG.

GiaoTrinhDataDataContext db =new GiaoTrinhDataDataContext(); var

DonDatHang = db.DONDATHANGs.Where(a => a.NGAYCHUYENHANG == null);

foreach (var don in DonDatHang) don.NGAYCHUYENHANG =

don.NGAYDATHANG; db.SubmitChanges(); flag_update = 0;

gvKetQua.DataSource = db.DONDATHANGs .Select(a => new {

a.SOHOADON, a.MAKHACHHANG, a.MANHANVIEN, a.NGAYDATHANG,

a.NGAYGIAOHANG, a.NGAYCHUYENHANG, a.NOIGIAOHANG });

34 Tăng số lượng hàng của những mặt hàng do công ty VINAMILK cung c ấp lên

gấp đôi.

GiaoTrinhDataDataContext db =new GiaoTrinhDataDataContext(); var

MatHang = db.MATHANGs.Where(a => a.NHACUNGCAP.TENGIAODICH ==

"VINAMILK"); foreach (var item in MatHang) item.SOLUONG =

item.SOLUONG * 2; db.SubmitChanges(); flag_update = 0;

gvKetQua.DataSource = db.MATHANGs .Where(a =>

a.NHACUNGCAP.TENGIAODICH == "VINAMILK") .Select(b => new {

b.MAHANG, b.TENHANG, b.NHACUNGCAP.TENCONGTY,

b.LOAIHANG.TENLOAIHANG, b.SOLUONG, b.DONVITINH, b.GIAHANG });

35 Cập nhật giá trị của trường NOIGIAOHANG trong bảng DONDATHANG bằng

địa chỉ của khách hàng đối với những đơn đặt hàng chưa xác định được nơi giao

hàng (giá trị trường NOIGIAOHANG bằng NULL).

Page 12: TỔNG HỢP CÁC CÂU TRUY VẤN LINQ

GiaoTrinhDataDataContext db =new GiaoTrinhDataDataContext(); var

DonDatHang = db.DONDATHANGs.Where(a => a.NOIGIAOHANG == null);

foreach (var item in DonDatHang) item.NOIGIAOHANG =

item.KHACHHANG.DIACHI; db.SubmitChanges(); flag_update = 0;

gvKetQua.DataSource = db.DONDATHANGs .Select(a => new {

a.SOHOADON, a.KHACHHANG.TENCONGTY, NHANVIENLAP = a.NHANVIEN.HO +

" " + a.NHANVIEN.TEN, a.NGAYDATHANG, a.NGAYGIAOHANG,

a.NGAYCHUYENHANG, a.NOIGIAOHANG });

36 Cập nhật lại dữ liệu trong bảng KHACHHANG sao cho nếu t ên công ty và tên

giao dịch của khách hàng trùng với tên công ty và tên giao dịch của một nhà

cung cấp nào đó thì địa chỉ, điện thoại, fax và e-mail p hải giống nhau.

GiaoTrinhDataDataContext db =new GiaoTrinhDataDataContext(); var

table_kh = from kh in db.KHACHHANGs where (from ncc in

db.NHACUNGCAPs select new { ncc.TENCONGTY }).Contains(new {

TENCONGTY = kh.TENCONGTY }) && (from ncc in db.NHACUNGCAPs select

new { ncc.TENGIAODICH }).Contains(new { TENGIAODICH =

kh.TENGIAODICH }) select kh; foreach (var item in table_kh) {

NHACUNGCAP infor_ncc = db.NHACUNGCAPs.Single(a => a.TENGIAODICH

== item.TENGIAODICH&&a.TENCONGTY==item.TENCONGTY); item.DIACHI =

infor_ncc.DIACHI; item.DIENTHOAI = infor_ncc.DIENTHOAI; item.FAX

= infor_ncc.FAX; item.EMAIL = infor_ncc.EMAIL; }

db.SubmitChanges(); gvKetQua.DataSource = table_kh;

37 Tăng lương lên gấp rưỡi cho những nhân viên bán được số lượng hàng nhiều

hơn 100 trong năm 2003.

var nhanvien = from nv in (from d in db.DONDATHANGs where

d.NGAYDATHANG.Value.Year == 2003 select new { d.MANHANVIEN,

TENNHANVIEN = d.NHANVIEN.HO + " " + d.NHANVIEN.TEN, SOLUONG =

d.CHITIETDATHANGs.Sum(a => a.SOLUONG), LUONGCOBAN =

String.Format("{0:0,0 NVĐ}", (double)d.NHANVIEN.LUONGCOBAN) })

where nv.SOLUONG > 100 select nv; foreach (var item in nhanvien)

{ NHANVIEN nv= db.NHANVIENs.Single(a => a.MANHANVIEN ==

item.MANHANVIEN); nv.LUONGCOBAN = nv.LUONGCOBAN *(decimal) 1.5; }

db.SubmitChanges(); gvKetQua.DataSource = nhanvien;

38 Tăng phụ cấp lên bằng 50% lương cho những nhân viên bán được hàng nhiều nhất.

var nhanvien = (from nv in (from d in db.DONDATHANGs select new {

d.MANHANVIEN, TENNHANVIEN = d.NHANVIEN.HO + " " + d.NHANVIEN.TEN,

SOLUONG = d.CHITIETDATHANGs.Sum(a => a.SOLUONG),

Page 13: TỔNG HỢP CÁC CÂU TRUY VẤN LINQ

d.NHANVIEN.PHUCAP }) group nv by nv.SOLUONG into g select

g).OrderByDescending(a => a.Key).First(); foreach (var item in

nhanvien) { NHANVIEN nv = db.NHANVIENs.Single(a => a.MANHANVIEN

== item.MANHANVIEN); nv.PHUCAP = nv.PHUCAP + nv.PHUCAP *(float)

0.5; }

39 Giảm 25% lương của những nhân viên trong năm 2003 không l ập được bất kỳ

đơn đặt hàng nào.

var nhanvien = from nv in db.NHANVIENs where !(from d in

db.DONDATHANGs group d by d.MANHANVIEN into g select new {

MANHANVIEN = g.Key }).Contains(new { MANHANVIEN = nv.MANHANVIEN

}) select nv; foreach (var item in nhanvien) { item.LUONGCOBAN =

item.LUONGCOBAN - item.LUONGCOBAN *(decimal)0.25; }

db.SubmitChanges(); gvKetQua.DataSource = nhanvien;

40 Giả sửtrong bảng DONDATHANG có thêm trường SOTIEN cho biết số tiền

mà khách hàng phải trả trong mỗi đơn đặt hàng. Hãy tính giá trị cho trường này.

GiaoTrinhDataDataContext db = new GiaoTrinhDataDataContext(); var

DonDatHang = from d in db.DONDATHANGs select new { d.SOHOADON,

NHANVIENLAP = d.NHANVIEN.HO + " " + d.NHANVIEN.TEN,

d.KHACHHANG.TENCONGTY, d.NGAYDATHANG, d.NGAYGIAOHANG,

d.NGAYCHUYENHANG, d.NOIGIAOHANG, SOTIEN =string.Format("{0:0,0

VNĐ}", d.CHITIETDATHANGs.Sum(a => (float)a.SOLUONG *

(float)a.GIABAN - (float)a.SOLUONG * (float)a.GIABAN *

(float)a.MUCGIAMGIA)) }; gvKetQua.DataSource = DonDatHang;

III. Xóa (delete)

41 Xoá khỏi bảng NHANVIEN những n hân viên đã làm việc trong cty quá 40 Năm

foreach (var item in db.NHANVIENs) { if ((DateTime.Now.Year -

item.NGAYLAMVIEC.Value.Year) > 40)

db.NHANVIENs.DeleteOnSubmit(item); } db.SubmitChanges();

gvKetQua.DataSource = db.NHANVIENs;

42 Xoá những đơn đặt hàng trước năm 2000 ra khỏi cơ sở dữ liệu.

foreach (var item in db.DONDATHANGs) { if

(item.NGAYDATHANG.Value.Year < 2000)

db.DONDATHANGs.DeleteOnSubmit(item); } db.SubmitChanges();

gvKetQua.DataSource = db.DONDATHANGs;

Page 14: TỔNG HỢP CÁC CÂU TRUY VẤN LINQ

43 Xoá khỏi bảng LOAIHANG những loại h àng hiện không có mặt hàng.

var loai_hang = from lh in db.LOAIHANGs where !(from lh2 in

db.MATHANGs select new { lh2.MALOAIHANG }).Contains(new {

MALOAIHANG = (Int32?)lh.MALOAIHANG }) select lh; foreach (var

item in loai_hang) { db.LOAIHANGs.DeleteOnSubmit(item); }

db.SubmitChanges();

44 Xoá khỏi bảng KHACHHANG những khách h àng hiện không có bất kỳ đơn đặt

hàng nào cho công ty.

var khachhang = from kh in db.KHACHHANGs where !(from kh2 in

db.DONDATHANGs select new { kh2.MAKHACHHANG }) .Contains(new {

MAKHACHHANG = kh.MAKHACHHANG }) select kh; foreach (var item in

khachhang) { db.KHACHHANGs.DeleteOnSubmit(item); }

45 Xoá khỏi bảng MATHANG những mặt h àng có số lượng bằng 0 và không được đặt

mua trong bất kỳ đơn đặt hàng nào.

var MatHang = from mh in db.MATHANGs where mh.SOLUONG == 0 &&

!(from ct in db.CHITIETDATHANGs select new { ct.MAHANG

}).Contains(new { MAHANG = mh.MAHANG }) select mh; foreach (var

item in MatHang) { db.MATHANGs.DeleteOnSubmit(item); }

db.SubmitChanges(); gvKetQua.DataSource = db.MATHANGs;