Chuyển đến nội dung chính

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

Nhận xét

Bài đăng phổ biến từ blog này

[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.

ASP.NET MVC: Cơ bản về Validation

Validation (chứng thực) là một tính năng quan trọng trong ASP.NET MVC và được phát triển trong một thời gian dài. Validation vắng mặt trong phiên bản đầu tiên của asp.net mvc và thật khó để tích hợp 1 framework validation của một bên thứ 3 vì không có khả năng mở rộng. ASP.NET MVC2 đã hỗ trợ framework validation do Microsoft phát triển, tên là Data Annotations. Và trong phiên bản 3, framework validation đã hỗ trợ tốt hơn việc xác thực phía máy khách, và đây là một xu hướng của việc phát triển ứng dụng web ngày nay.

Tổng hợp một số kiến thức lập trình về Amibroker

Giới thiệu về Amibroker Amibroker theo developer Tomasz Janeczko được xây dựng dựa trên ngôn ngữ C. Vì vậy bộ code Amibroker Formula Language sử dụng có syntax khá tương đồng với C, ví dụ như câu lệnh #include để import hay cách gói các object, hàm trong các block {} và kết thúc câu lệnh bằng dấu “;”. AFL trong Amibroker là ngôn ngữ xử lý mảng (an array processing language). Nó hoạt động dựa trên các mảng (các dòng/vector) số liệu, khá giống với cách hoạt động của spreadsheet trên excel.