Posts Tagged ‘linq tip’
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:
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());
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;