[LINQ] LinQ Là Gì Và Tại Sao Nên Dùng LinQ?

Thảo luận trong 'Tài Liệu' bắt đầu bởi Pussy, Thg 11 7, 2016.

  1. Pussy

    Pussy New Member Chuyển tiền Tìm chủ đề

    Bài viết:
    Tìm chủ đề
    950
    Với SQLExpress để truy vấn dữ liệu ta phải dùng đến các câu lệnh - Query khá phức tạp. Hơn nữa để sử dụng trong ứng dụng C# lại thêm 1 tầng phức tạp nữa với các câu lệnh: dùng ConnectionString khởi tạo kết nối tới DataBase, tự khai báo các biến để chạy 1 lệnh - command, rồi còn phải tính toán đầu ra của câu lệnh... Thật là quá phức tạp nếu như ta có 1 chương trình "khủng"

    Vậy làm sao để giải quyết vấn đề này?

    Một đề xuất là sử dụng Linq to SQL.

    Không chỉ áp dụng cho truy vấn SQL mà LinQ còn có khả năng hỗ trợ trên nhiều nền tảng khác: XML, SQLite, Excel...

    I. LinQ là gì?

    [​IMG]

    Để giảm gánh nặng thao tác trên nhiều ngôn ngữ khác nhau và cải thiện năng suất lập trình, Microsoft đã phát triển giải pháp tích hợp dữ liệu cho .NET Framework có tên gọi là LINQ (Language Integrated Query), đây là thư viện mở rộng cho các ngôn ngữ lập trình C# và Visual Basic.NET (có thể mở rộng cho các ngôn ngữ khác) cung cấp khả năng truy vấn trực tiếp dữ liệu Object, CSDL và XML.

    LINQ là một tập hợp các thành phần mở rộng cho phép viết các câu truy vấn dữ liệu ngay trong một ngôn ngữ lập trình, như C# hoặc VB.NET. Khi tạo một đối tượng LINQ thì Visual Studio sẽ tự động sinh ra các lớp có các thành phần tương ứng với CSDL của chúng ta. Khi muốn truy vấn, làm việc với CSDL ta chỉ việc gọi và truy xuất các hàm, thủ tục tương ứng của LINQ mà không cần quan tâm đến các câu lệnh SQL thông thường.
    Tóm lại LINQ ra đời để giảm công sức cho những quá trình đơn giản và “chung chung” trước đây.

    Điểm mạnh (chưa chắc về độ mạnh, nhưng hay) của LINQ là “viết truy vấn cho rất nhiều các đối tượng dữ liệu”. Từ CSDL, XML Data Object … thậm chí là viết truy vấn cho một biến mảng đã tạo ra trước đó. Vì vậy mới có các khái niệm LinQ to SQL, LinQ to XML, blo bla..

    Tuy nhiên so với mô hình Entity (Entity Framework), LINQ có yếu điểm là chậm và thiếu nhất quán (hiện đại tất phải hại điện).

    LINQ có từ bản .NET 3.5, vậy nên tối thiểu chương trình của bạn phải chạy trên nền tảng này.

    Visual Studio 2008, hoặc các phiên bản Express của nó là các bộ công cụ phát triển tiêu biểu cho ứng dụng dùng LINQ.

    II. Sử dụng LinQ

    [​IMG]
    Câu lệnh SELECT trong SQL được thực hiện bởi LINQ

    Trong phần này tôi sẽ sử dụng 1 project demo để các bạn thấy được cách làm việc với LINQ như thế nào?!
    CSDL là 1 bảng tbTest với 2 trường: id (kiểu int, tự động tăng - Identity) và Feild1 (kiểu nvarchar(50)).

    1. Khởi tạo đối tượng LinQ to SQL

    Trong project chọn Add > Data > LinQ to SQL classes

    [​IMG]

    Ở đây tôi tạo 1 file DB.dbml trong thư mục DB để dễ quản lý.

    Sau khi có được file ta tiến hành kéo các table cần thiết vào để tự động sinh các thủ tục LinQ

    [​IMG]

    Vậy là xong, ta đã tạo được các thủ tục cần thiết để làm việc với LINQ. Easy??!! :)

    2. Truy vấn dữ liệu


    Tương tự như Entity ta phải khai báo 1 biến DataContext để tương tác với LinQ

    Mã:
    DB.DBDataContext db = new DB.DBDataContext(); 
    Có 2 kiểu truy vấn dữ liệu:

    Query Syntax

    Mã:
    var abc = from p in db.tbTests
              where p.id > 10
              select p;
    // Hoặc chọn một số trường
    var abc = from p in db.tbTests
              where p.id > 10
              select new
              {
                  p.id,
                  p.Feild1
              };
    Method Syntax

    Mã:
    var xyz = db.tbTests.Where(p => p.id > 10).Select(p => new { p.id, p.Feild1 });
    Câu truy vấn SQL tương ứng

    Mã:
    SELECT [id]
          ,[Feild1]
      FROM [dbo].[tbTest]
      WHERE [id] > 10
    Chọn từ nhiều bảng theo kiểu Inner Join (lấy những bản ghi có điều kiện thỏa mãn)

    Mã:
    // Query Syntax
    var result = from p in products
                 join c in categories on p.CategoryID equals c. CategoryID
                 select new
                 {
                     ProductName=p.ProductName,
                     CategoryName=c.CategoryName
                 };
    // Hoặc chọn từ 2 bảng bằng cách from 2 lần  :)
    var result = from p in products
                 from c in categories
                 where p.ProductName equals c.CategoryName
                 select new
                 {
                     ProductName=p.ProductName,
                     CategoryName=c.CategoryName
                 };
    // Method Syntax
    var result = products.Join(
                 categories,
                 p=>p.CategoryID,
                 c=>c.CategoryID,
                 (p,c) => new
                 {
                     ProductName=p.ProductName,
                     CategoryName=c.CategoryName
                 });
    Cú pháp khác tương tự các câu lệnh trong SQL

    Các biến ở trên trả về có kiểu IEnumrable, 1 loại kiểu dữ liệu giống như List. Các thao tác cơ bản với loại biến này:
    • xyz.FirstOrDefault(): Chọn bản ghi đầu tiên hoặc mặc định
    • xyz.Skip(5): Nhảy qua n bản ghi
    • xyz.Take(5): Lấy n bản ghi đầu tiên
    • xyz.ToList(): Chuyển sang kiểu List
    • xyz.Count(): đếm số bản ghi
    • xyz.Select(...), xyz.Where(...), xyz.Join(...): Các câu lệnh truy vấn theo kiểu Method Syntax
    • bla bla
    Đôi khi bạn không tìm được cú pháp thích hợp hoặc LinQ không hỗ trợ loại truy vấn mà vốn có trong SQL thì bạn có thể thực hiện trực tiếp câu lệnh đó thông qua LinQ:

    Mã:
    var result = db.ExecuteQuery<int>("SELECT NEXT VALUE FOR seq_tbCanBo")

    3. Thêm, sửa, xóa dữ liệu thông qua LinQ

    Thêm dữ liệu

    Mã:
    DB.tbTest a = new DB.tbTest();      // Khai báo đối tượng mới
    a.Feild1 = txtFeild1.Text;      // id là giá trị tự động tăng > ko cần thay đổi
    db.tbTests.InsertOnSubmit(a);   // Thêm đối tượng a vào
    db.SubmitChanges();     // Lưu thay đổi
    Sửa dữ liệu

    Mã:
    var a = (from p in db.tbTests
             where p.id == int.Parse(txtId.Text)
             select p).FirstOrDefault();
    a.Feild1 = txtFeild1.Text;
    db.SubmitChanges();
    Xóa dữ liệu

    Mã:
    var a = (from p in db.tbTests
             where p.id == int.Parse(txtId.Text)
             select p).FirstOrDefault();
    db.tbTests.DeleteOnSubmit(a);
    db.SubmitChanges();

    III. Bindding

    Bindding là cách thuận tiện để thay đổi, cập nhật, thêm mới bản ghi ở CSDL một cách dễ dàng trực quan, sử dụng LinQ.

    Giả sử ta thực hiện Bindding ở 1 bảng, có 2 chế độ (kiểu hiển thị) là GridView và Detail:




      • Chế độ GridView: có 1 gridview để hiển thị các bản ghi trong bảng, tương tự như khi chúng ta chạy câu truy vấn SELECT * trong SQL
      • Detail: các Control cho phép thay đổi giá trị của bản ghi đang được chọn ở Gridview. Khi click vào 1 hàng ở Gridview thì dữ liệu của hàng đó sẽ được điền tự động vào các Control này.
    Cách dùng Bindding:
    [FONT=Georgia, Times New Roman, serif][/FONT]
    Trong chế độ Design form, mở cửa sổ Data Sources, ở đây các bảng trong file DB.dbml (được tạo khi khởi tạo LinQ) sẽ được hiển thị, giúp ta có thể kéo vào trong form của mình

    Với mỗi bảng có các tùy chọn để chọn chế độ xem: Gridview, Detail..

    [​IMG]

    Tạo Bindding bằng cách kéo thả

    Sau khi kéo như vậy thì nó sinh ra 1 đối tượng là tbTestBinddingSource, đây chính là đối tượng tương tác với SQL, LinQ.

    Quy định nguồn dữ liệu cho Bindding:

    Mã:
    // DataSource là 1 bảng có sẵn
    tbTestBindingSource.DataSource = db.tbTests;
    // Datasource là một đối tượng IEnumrable lấy từ truy vấn LINQ
    tbTestBindingSource.DataSource = result;

    Bạn có thể kéo 1 BinddingNavigator để thực hiện các thao tác thêm, xóa dễ dàng

    [​IMG]

    Khi đã có Bindding như thế này rồi thì việc thêm sửa xóa cực kỳ đơn giản, không cần code nhiều, sau khi thay đổi trên gridview, detail để lưu tất cả các thay đổi chỉ cần

    Mã:
    tbTestBindingSource.EndEdit();
    db.SubmitChanges();
    Các thao tác có thể làm với BinddingSource

    Mã:
    tbTestBindingSource.RemoveCurrent();    // Xóa hàng hiện tại
    // Di chuyển trên gridview
    tbTestBindingSource.MoveFirst();
    tbTestBindingSource.MoveLast();
    tbTestBindingSource.MoveNext();
    tbTestBindingSource.MovePrevious();
    tbTestBindingSource.Position = 5;   // Xác định vị trí cho Bindding
    Sau số thao tác thay đổi trên grid view, bạn muốn xem số hàng thêm mới, sửa xóa?

    Mã:
    int insert = db.GetChangeSet().Inserts.Count;
    int update = db.GetChangeSet().Updates.Count;
    int delete = db.GetChangeSet().Deletes.Count;
    Tham khảo project demo trên tại đây

    Các bạn có thể truy cập liên kết để có thêm thông tin, các thao tác với LINQ.
     
    Last edited by a moderator: Thg 8 21, 2018
  2. Đang tải...
    Similar Threads - [LINQ] LinQ Là
    1. Pussy
      Trả lời:
      0
      Đọc:
      1,374
Trả lời qua Facebook

Chia sẻ trang này