Skip to main content

Tóm tắt LINQ

Những hiểu biết được tổng hợp từ :
http://namdh.wordpress.com
http://weblogs.asp.net/scottgu/
Google + ebooks
I Căn bản - LINQ
1- Khái niệm
- Chúng ta có thể viết ngay các câu lệnh truy vấn database giống như là sql trên code
- LINQ-Object, LINQ-SQL, LINQ-XML
2- Nền tảng của LINQ
A - Query Operator và Query Expression
Query Operator
+ Khái niệm
Là 1 tập hợp những extension method mà ở đây nó thực hiện việc truy vấn dữ liệu như là Where, Select
+ Thuận Lợi
Có đầy đủ các chức năng cần thiết để truy vấn, được microsoft hỗ trợ đầy đủ
+ Khó khăn
Khó sử dụng vì phải hiểu cơ chế làm việc, sử dụng lambda để giải quyết ( sử dụng toán tử => hơi giống C++), muốn hiểu rõ hơn và sử dụng thì phải hiểu về delegate, extension method vv. Nói chung là rất nhiều
Query Expression
+ Khái niệm
Tương tự như là cú pháp của sqlserver, khi complier nó sẽ truyền tải và gọi những query operator tương ứng
+ Thuận lợi
Dễ sử dụng khi mới học LINQ cú pháp khá giống với SQL server, dễ hiểu
+ Khó khăn
Không đầy đủ các chức năng, thiếu nhiều toán tử hỗ trợ ví dụ như count. Lúc đó bạn phải dùng và kết hợp operator

Ví dụ se cho bạn thấy việc sử dụng query và expression
using System;
using System.Diagnostics;
using System.Linq;

namespace QueryExpression
{
  class Program
  {
    static void Main(string[] args)
    {
      // Method syntax (dot-notation)
      var processes1 =
        Process.GetProcesses()
          .Where(process => process.WorkingSet64 > 20*1024*1024)
          .OrderByDescending(process => process.WorkingSet64)
          .Select(process => new { process.Id, Name=process.ProcessName });

      Console.WriteLine("With method syntax:");
      foreach (var process in processes1)
        Console.WriteLine(process);

      Console.WriteLine();

      // Query expression
      var processes2 = 
        from process in Process.GetProcesses()
        where process.WorkingSet64 > 20*1024*1024
        orderby process.WorkingSet64 descending
        select new { process.Id, Name=process.ProcessName };

      Console.WriteLine("With query expression:");
      foreach (var process in processes2)
        Console.WriteLine(process);
    }
  }
}

C-INumerable
LINQ - Object thì sẽ thực thi INumerable. Đơn giản nó là 1 interface được sử dụng để gọi những sequence (expression and operator) trong thư viện của LINQ.
Toàn bộ dữ liệu được đặt trong memory
Thuận lợi
Dynamic query - Có thể kết hợp nhiều câu query lại với nhau
Ví dụ: var _vQuery = from book in books select book; <-- luc nay câu query chưa được thực thi chúng ta có thể nối thêm query vào câu query này, đây là cơ chế deferred sẽ được giới thiệu trong phần dưới

Khó khăn
LINQ-Object được sử dụng để truy lục generic collection mà ở đây thực thi System.Collec-
tions.Generic.IEnumerable<T> interface (Ví dụ như các kiểu List<T> vvv). Nhưng các kiểu không phải là generic thì chúng ta cần phải cast chẳng hạn như ArrayList, chúng ta có thể sử dụng ArrayList.Cast, hoặc query expression
ArrayList books = GetArrayList();

var query =  from book in books.Cast<Book>() where book.PageCount > 150
                 select new { book.Title, book.Publisher.Name };
dataGridView.DataSource = query.ToList();

var query = from Book book in books where book.PageCount > 150
                select new { book.Title, book.Publisher.Name };


Book: chính là object Book trong dataContext
Ở đây chúng ta sẽ thấy cú pháp select new {} - kiểu Anonymous có thể sử dụng trong việc join

D-IQueryable
Thuận lợi
- Giảm network, giảm sử lý ở client, tận dụng index từ database
Khó khăn

Cả IEnumerable và IQueryable đều được áp dụng cơ chế xử lý deferred query execution (Trì hoãn thực thi truy vấn)
Đây là 1 khái niệm rất quan trọng trong LINQ, nếu không có nó sự thực thi của LINQ sẽ rất tệ
Nó cho phép định nghĩa câu truy vấn tại 1 thời điểm và có thể sử dụng nó cho sau này

Khi bạn sử dụng với database theo tôi nên sử dụng LINQ-SQL, tại sao Microsoft lại đưa ra LINQ-Object, LINQ-SQL, LINQ-XML ... Tại sao lại không sử dụng LINQ-Object cho tất cả trường hợp?
Giả sử khi tôi truy lục
var subjects = dataContext.GetTable<Subject>().ToList<Subject>();
Nó sẽ được xử lý bởi LINQ-Object chứ không phải là LINQ - SQL
Bằng việc chuyển đổi sang List hoặc Array (trả về kiểu IEnumerable) chúng ta sẽ mất đi lợi ích của LINQ-SQL như là tối ưu dữ liệu truy lục, giới hạn dữ liệu đặt trong memory
Nguồn: codepro.vn

Comments

Popular posts from this blog

Lập trình đa luồng với Task

Bài viết được đăng trên Jou Lập trình
Trong phiên bản .NET framework 4.0, Microsoft đã bổ sung nhiều thư viện hỗ trợ việc xử lý đa luồng (multi-threading), nhằm đơn giản hóa việc lập trình lẫn hiệu suất của chương trình. Trong bài viết này, tôi xin hướng dẫn các bạn sử dụng lớp System.Threading.Task.

Tìm hiểu về IdentityServer 4

Trong bài viết này, mình sẽ hướng dẫn các bạn làm quen với thư viện Identity Server 4, và tích hợp các service In-Memory của Identity Server 4 vào Project Web API trong .NET Core.

[ASP.NET MVC] Authentication và Authorize

Một trong những vấn đề bảo mật cơ bản nhất là đảm bảo những người dùng hợp lệ truy cập vào hệ thống. ASP.NET đưa ra 2 khái niệm: Authentication và Authorize
Authentication xác nhận bạn là ai. Ví dụ: Bạn có thể đăng nhập vào hệ thống bằng username và password hoặc bằng ssh.
Authorization xác nhận những gì bạn có thể làm. Ví dụ: Bạn được phép truy cập vào website, đăng thông tin lên diễn đàn nhưng bạn không được phép truy cập vào trang mod và admin.