Chủ nhật, ngày 4 tháng 12 năm 2016

LINQ-Phần 4: Linq nâng cao

Ngày đăng: 5/7/2011, 8:47:17PM | Lượt xem: 5,637
Hot!

Cách làm việc của Linq đơn thuần chuyển đoạn mã của bạn thành câu truy vấn, rồi chuyển nó qua máy chủ SQL xử lý. Tuy nhiên Linq không đáp ứng hết yêu cầu bạn cần(chẳng hạng là Compute và Cube trong MS SQL). Trong trường hợp này bạn có thể sử dụng ExcuteQuery, ExcuteCommand để truy vấn hay thực thi dữ liệu trực tiếp, sau đó có thể chuyển kết quả sang kiểu đối tượng.

Trươc tiên ta tìm hiểu vể cách truy vấn trực tiếp dùng ExcuteQuery. Linq cung cấp hai phương thức để truy vấn dữ liệu.

public IEnumerable<TResult> ExecuteQuery<TResult>(string query, params Object[] parameters)
public IEnumerable ExecuteQuery(Type elementType, string query, params Object[] parameters)

Phương thưc ExcuteQuery nhận vào một câu lênh SQL và các tham số kèm theo. Với câu lệnh SQL bạn có thể là câu query đơn thuần, hay phức tạp như Union, Join, Compute, Cube, group by, having… Hai đoạn code sau đây sử dụng linq truy vấn trực tiếp và linq cổ điển(ở đây tôi tạm gọi cách truy vấn hay được dùng là cách cổ điển) nhưng trả về cùng kết quả.

//Sử dung ExecuteQuery
NorthwindDataContext context = new NorthwindDataContext();
var details = context.ExecuteQuery<Order_Detail>("SELECT * FROM [ORDER DETAILS]");
List<Order_Detail> itemList = new List<Order_Detail>();
foreach (var item in details)
{
itemList.Add(item);
}
dataGridView1.DataSource = itemList;

//Sử dụng linq đơn thuần
NorthwindDataContext context = new NorthwindDataContext();
var details = from od in context.Order_Details
select od;
List<Order_Detail> itemList = new List<Order_Detail>();
foreach (var item in details)
{
itemList.Add(item);
}
dataGridView1.DataSource = itemList;

Đặc trưng của truy vấn trực tiếp là cho phép chỉ định kiểu dữ liệu trả về. Chính sự hổ trợ này làm nó linh động hơn linq cổ điển. Xem xét đoạn code sau để thấy đươc sự linh đông của nó.

NorthwindDataContext context = new NorthwindDataContext();
var details = context.ExecuteQuery<Order_Detail>("SELECT OrderID, ProductID, UnitPrice, Quantity FROM [ORDER DETAILS]");
List<Order_Detail> itemList = new List<Order_Detail>();
foreach (var item in details)
{
itemList.Add(item);
}
dataGridView1.DataSource = itemList;

Các trường không được chỉ định trong câu truy vấn sẻ chứa giá trị 0 hoặc null tùy theo kiễu dữ liệu trong DB. Đối với Linq cổ điển bạn không làm được điều này, bạn phải thông qua một vài dòng code để chuyển dữ liệu trả về sang kiểu dữ liệu Order_Detail.

NorthwindDataContext context = new NorthwindDataContext();
var details = from od in context.Order_Details
select new { od.OrderID, od.ProductID, od.UnitPrice };
List<Order_Detail> itemList = new List<Order_Detail>();
foreach (var item in details)
{
Order_Detail detail = new Order_Detail();
detail.OrderID = item.OrderID;
detail.ProductID = item.ProductID;
detail.UnitPrice = item.UnitPrice;
itemList.Add(detail);
}
dataGridView1.DataSource = itemList;

Linq không cho phép thay đổi hay xóa mẫu tin một cách trưc tiếp, mà bạn phải truy vấn nó lên rồi loop qua từng mẫu tin. Nhứ vậy bạn phải viết code nhiều hơn và đoạn code trong phưc tạp hơn nhiều. Do đó ExcuteCommand là lựa chọn tốt khi cần thực thi dữ liêu chỉ bằng môt vài dòng code. ExcuteCommand dùng để thực thi dữ liệu xuống CSDL như insert, update, delete. ExcuteCommand chỉ cung cấp duy nhất một phương thức thực thi dữ liệu.

public int ExecuteCommand(string command, params Object[] parameters)

Cũng giống như trên ExcuteCommand nhận vào một câu lênh SQL và một tập các tham số. Tuy nhiên ExcuteCommand có giá trị trả về(Int).
Giá trị này cho biết số mẫu tin đã thực hiện trong câu lệnh.

int result = context.ExecuteCommand("update [Order Details] set UnitPrice = 15 where ProductID = {0} and OrderID = {1}",1,10248);
 Chia sẻ qua: 
Hot!
Ý kiến bạn đọc

These items will be permanently deleted and cannot be recovered. Are you sure?

Gallery

image

Maecenas viverra rutrum pulvinar

Maecenas viverra rutrum pulvinar! Aenean vehicula nulla sit amet metus aliquam et malesuada risus aliquet. Vestibulum rhoncus, dolor sit amet venenatis porta, metus purus sagittis nisl, sodales volutpat elit lorem…

Read more

Text Links

Thiết kế logo chuyên nghiệp Insky
DAFABET
W88 w88b.com/dang-ky-tai-khoan-w88
W88
Copyright © 2011 - 2012 vietshare.vn by phamkhuong102@gmail.com doanhkisi2315@gmail.com. All rights reserved.