LINQ tip #4: Dùng WHERE

Khi xây dựng các form tìm kiếm với SQL, chúng ta vẫn thường phải xây dựng một chuỗi SQL với nhiều điều kiện trong WHERE, theo kiểu như:

string sql = "select * from Customers";
string where = "";
if (txtCustomerName.Text != "")
    where += String.Format("CustomerName = {0}", txtCustomerName.Text);
if (where != "")
    sql += " WHERE " + where;

MyDataGrid.DataSource = ... <kết quả trả về bởi câu truy vấn>

Trong LINQ, nếu muốn xây dựng một câu truy vấn LINQ kiểu như vậy, bạn có thể sử dụng câu lệnh Where() kết hợp với biểu thức LAMBDA, với ví dụ trên tôi có thể viết như sau:

DataClasses1DataContext dc = new DataClasses1DataContext();
var q = from p in dc.Products select p;
if (txtCustomerName.Text != "")
    q = q.Where(p => p.Name != txtCustomerName.Text);
MyDataGrid.DataSource = q;

Lấy các dòng ngẫu nhiên (LINQ tip #3)

Trong SQL Server, để lấy về một tập kết quả ngẫu nhiên, bạn có thể viết:

SELECT TOP 5 * FROM myTable ORDER BY NEWID()

Trong LINQ, nếu muốn lấy về một tập kết quả ngẫu nhiên kiểu như trên, bạn cần tạo một hàm ngẫu nhiên, sau đó thêm nó vào LINQ designer, và dùng hàm đã tạo để sắp xếp. Các bước cụ thể như sau:

Continue reading “Lấy các dòng ngẫu nhiên (LINQ tip #3)”

LINQ tip #2

Khi thực hiện gắn nối dữ liệu vào DataSource của một DataGridView, đừng gắn nối trực tiếp đối tượng Table vào DataSource kiểu như sau:

MyDbContext db = new MyDbContext(); myGridView.DataSource = db.Products;

Nếu bạn viết như trên, trong trường hợp bạn thêm dữ liệu vào, dữ liệu trong DataGridView sẽ không tự động hiển thị dòng mới, thay vì vậy hãy dùng hàm GetNewBindingList():


myGridView.DataSource = db.Products.GetNewBindingList(); 

 
Để thêm một dòng mới, bạn có thể viết: ((IBindingList)myGridView.DataSource).Add(new MyData()); 
 

Dòng dữ liệu mới này sẽ được hiển thị trên DataGridView mà bạn không cần phải làm thêm bất kỳ thao tác nào.

LINQ tip #1

Để thực hiện một phép kiểm tra kiểu như “SELECT * FROM mytable WHERE col1 IN (1, 2, 3)”, các bạn có thể viết như sau:

int[] departments = {1, 2, 3};
var products = from p in db.Products where departments.Contains(p.dept_no) select p;