Tải bản đầy đủ (.pdf) (60 trang)

Tìm hiểu công nghệ lập trình LINQ trong Visual Studio 2010

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.4 MB, 60 trang )

BỘ CÔNG THƯƠNG
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP TP.HCM






ĐỒ ÁN : Tìm hiểu công nghệ lập trình LINQ
trong Visual Studio 2010.

GVHD : Ths. Tôn Long Phước
Lớp : ĐHTH6ALT
Sinh Viên :
Trần Minh Thảo (10344871)
Võ Thị Kim Xuyến (10327901)






Tp HCM, 11/2011

Tìm hiểu công nghệ lập trình LINQ trong Visual Studio 2010

2

MỤC LỤC
1. Giới thiệu về LINQ 3
1.1. Tại sao LINQ ra đời ? 4


1.2. LINQ là gì? 4
1.3. Các thành phần của LINQ 4
1.3.1. LINQ to Objects 5
1.3.2. LINQ to XML 5
1.3.3. LINQ to SQL 5
2. LINQ TO OBJECT 13
2.1. Giới thiệu 13
2.2. Truy vấn với một mảng 13
2.3. Bộ lọc dữ liệu 14
2.4. Phép chiếu 16
2.5. Phương thức Extension 19
3. LINQ to XML 21
3.1. Giới thiệu về LINQ to XML 21
3.2. Mô hình LINQ to XML 21
3.3. Xây dựng một cây XML 22
3.3.1. Tạo một phần tử XML 22
3.3.2. Tạo một thuộc tính cho phần tử XML: 23
3.3.3. Tạo ghi chú trong cây XML: 24
3.3.4. Xây dựng một cây XML. 25
3.4. XML namespace 26
3.4.1. Giới thiệu namespace 26
3.4.2. Tạo một namespace trong cây XML 27
3.4.3. Điều khiển tiền tố namespace trong cây XML 27
3.4.4. Viết truy vấn LINQ trong namespace 28
3.5. Những thao tác truy vấn cơ bản trên cây XML 29
3.5.1. Tìm một phần tử trong cây XML 29
3.5.2. Lọc phần tử trong cây XML 30
3.5.3. Sắp xếp các phần tử trong cây XML 31
Tìm hiểu công nghệ lập trình LINQ trong Visual Studio 2010


3

3.5.4. Kết hai cây XML 32
3.5.5. Nhóm các phần tử trong một cây XML 36
3.6. Những thao tác biến đổi trên cây XML 38
3.6.1. Thêm phần tử, thuộc tính và nút vào một cây XML 38
3.6.2. Thay đổi phần tử, thuộc tính và nút của một cây XML 39
3.6.3. Xóa phần tử, thuộc tính và nút từ một cây XML 42
4. LINQ to SQL 45
4.1. Giới thiệu 45
4.2. Mô hình hóa CSDL dùng LINQ to SQL: 46
4.3. Tìm hiểu lớp DataContext 48
4.4. Các ví dụ LINQ to SQL 49
4.4.1. Lấy các Product từ CSDL 49
4.4.2. Cập nhật một sản phẩm trong CSDL 49
4.4.3. Chèn thêm một phân loại mới và hai sản phẩm vào CSDL 49
4.4.4. Xóa các sản phẩm 50
4.4.5. Gọi một thủ tục 51
4.4.6. Lấy các sản phẩm và phân trang 51
4.5. Dùng các Stored Procedure 52
5. ƯU VÀ NHƯỢC ĐIỂM CỦA LINQ 54

Tìm hiểu công nghệ lập trình LINQ trong Visual Studio 2010

4

1. Giới thiệu về LINQ
1.1. Tại sao LINQ ra đời ?
Đã lâu lắm rồi, ngành công nghiệp phần mềm mới chứng kiến một cuộc đổi thay
mang tính bước ngoặc về mặt ngôn ngữ, đó chính là LINQ, được gọi là "Back to the

future", mang hơi hướng của một ngôn ngữ lập trình KHÔNG hướng đối tượng. Thật ra,
bản chất của nó chính là thống nhất sự khác biệt giữa hai mô hình : Đối tượng và Dữ liệu.
Một cách nôm na, giờ đây, chúng ta chỉ cần biết một ngôn ngữ mà thôi, không phải biết
thêm SQL, XPath
Nó cố gắng tiếp cận Data, nó đồng thời tự nâng cao năng lực của chính nó, đưa ra khả
năng lập trình mới trong .NET kiểu truy vấn :Sql DB, Objects và Xml…
1.2. LINQ là gì?
LINQ là viết tắt của từ Language – Integrated Query tạm dịch là ngôn ngữ tích hợp
truy vấn.
Theo định nghĩa trên thư viên MSDN của Microsoft, LINQ là một tập hợp các phần
mở rộng của .Net Frame Work. LINQ bao gồm ngôn ngữ tích hợp truy vấn, thiếp lập và
chuyển đổi hoạt động. LINQ là một tập hợp các thành phần mở rộng cho phép viết các
câu truy vấn dữ liệu ngay trong một ngôn ngữ lập trình, như C# hoặc VB.NET. Sự tích
hợp của LINQ nhằm loại bỏ rào cản giữa các ngôn ngữ lập trình và các cơ sở dữ liệu.
Các thành phần của LINQ
1.3. Các thành phần của LINQ
Tìm hiểu công nghệ lập trình LINQ trong Visual Studio 2010

5

1.3.1. LINQ to Objects
LINQ to Objects là tên được gán cho các API về IEnumrable<T> dùng cho các
thao tác truy vấn dữ liệu chuẩn (Standard Query Operations). Cho phép bạn thực thi các
truy vấn trên các mảng, các collection trong bộ nhớ. Các thao tác truy vấn dữ liệu chuẩn
này là các phương thức static của lớp static System.Linq.Enumrable. Bạn sử dụng các
phương thức này để tạo ra các truy vấn LINQ to Object.
1.3.2. LINQ to XML
LINQ to XML là tên được gán cho API chuyên dụng làm việc với XML.
Microsoft không chỉ thêm các thư viện XML cần thiết để làm việc với LINQ, họ còn
nhắm đến các nhược điểm của XML DOM chuẩn. Bằng cách đó chúng ta có thể thao tác

với XML dễ dàng hơn rất nhiều so với trước đây. Chúng ta sẽ không còn phải tạo ra cả
một XmlDocument chỉ để làm việc với một mẫu nhỏ XML. Để sử dụng LINQ to XML
chúng ta phải tham chiếu đến System.Xml.Linq.
1.3.3. LINQ to SQL
Là tên gọi được đặt cho API IQueryable<T>, cho phép LINQ làm việc với cơ sở
dữ liệu Microsoft SQL Server. Để sử dụng bạn phải tham chiếu đến System.Data.Linq.
Dùng câu truy vấn LINQ để truy vấn những nguồn dữ liệu khác nhau đến tầng
ADO.NET. Những nguồn dữ liệu này bao gồm .Net entities, SQL database và dataset.
1.4. Cú pháp truy vấn và Cú pháp phương thức
1.4.1. Cú pháp truy vấn (Query Syntax)
Cú pháp truy vấn được viết giống như các truy vấn T-SQL.
Select/SelectMany, Where, Sum/Min/Max/Average/Aggregate, Join/GroupJoin,
Take/TakeWhile, Skip/SkipWhile, OfType, concat, Orderby/ThenBy, Reverse,
GroupBy, Distinct, Union/Intersect/Except, EqualAll,
First/FirstOrDefault/Last/LastOrDefault, Single, ElementAt, Any/All/Contains,
Count.
Ngữ pháp của query expression
Một query expression phải tuân thủ chặt chẽ những luật sau đây:
Tìm hiểu công nghệ lập trình LINQ trong Visual Studio 2010

6

1. Một query expression phải bắt đầu với từ khóa from.
2. Phần còn lại của query expression có thể không hoặc chứa thêm nhiều
mệnh đề from, let hoặc where. Mệnh đề from là một mệnh đề chỉ định ra
các biến liệt kê dựa trên một chuỗi hay nhiều chuỗi được join lại với nhau.
Mệnh đề let khai báo một biến và gán giá trị cho biến đó. Mệnh đề where
lọc các thành phần từ chuỗi hoặc từ nhiều chuỗi join lại với nhau để ra
chuỗi xuất.
3. Phần còn lại của query expression có thể được theo sau bởi mệnh đề

orderby. Mệnh đề này chứa một hoặc nhiều filed với tùy chọn điều khiển
sắp xếp. Chỉ dẫn có thể là một trong hai ascending hoặc descending.
4. Phần còn lại của query expression phải theo sau bởi mệnh đề select hoặc
group.
5. Phần còn lại của query expression có thể được theo sau bởi những mệnh
đề tùy chọn tiếp theo (optional continuation clause). Một mệnh đề optional
continuation có thể là một trong hai, hoặc mệnh đề into, hoặc không hay
nhiều mệnh đề join, hoặc sự lặp lại của các mệnh đề trong luật số 2. Mệnh
đề into đưa kết quả truy vấn vào một chuỗi xuất ảo, mà nó hoạt động
nhưng một mệnh đề from cho một query expression theo sau được bắt đầu
bởi các mệnh đề ở luật số 2.
Bạn có thể sử dụng hệ thống văn phạm dưới đây được cung cấp bởi MSDN
query-expression:
from-clause query-body
from-clause:
from typeopt identifier in expression join-clausesopt
join-clauses:
join-clause
join-clauses join-clause
join-clause:
join typeopt identifier in expression on expression equals
Tìm hiểu công nghệ lập trình LINQ trong Visual Studio 2010

7

expression
join typeopt identifier in expression on expression equals
expression into identifier
query-body:
from-let-where-clausesopt orderby-clauseopt select-or-group-clause

query-continuationopt
from-let-where-clauses:
from-let-where-clause from-let-where-clauses from-let-where-clause
from-let-where-clause:
from-clause
let-clause
where-clause
let-clause:
let identifier = expression
where-clause:
where boolean-expression
orderby-clause:
orderby orderings
orderings:
ordering
orderings , ordering
ordering:
expression ordering-directionopt
ordering-direction:
ascending
descending
Tìm hiểu công nghệ lập trình LINQ trong Visual Studio 2010

8

select-or-group-clause:
select-clause
group-clause
select-clause:
select expression

group-clause:
group expression by expression
query-continuation:
into identifier join-clausesopt query-body
1.4.2. Cú pháp phương thức (Method Syntax) :
Các truy vấn được viết như các phương thức bình thường, chúng còn được gọi
với một cái tên khác là các toán tử truy vấn chuẩn

1.4.2.1. Biểu thức LAMBDA
Trong C# 3.5, Microsoft thêm vào các biểu thức lambda (lambda expression).
Lambda expression được sử dụng trong ngôn ngữ máy tính từ thời ngôn ngữ LISP.
Những biểu thức này giúp chúng ta tốc kí cú pháp khi chỉ ra một thuật toán.

Biểu thức lambda được định dạng bao gồm một dãy các tham số được đặt bên
trong dấu ngoặc đơn (các tham số này cách nhau bởi dấu phẩy, nếu chỉ có một tham
số thì không cần dấu ngoặc đơn), theo sau tham số là toán tử lambda, theo sau nữa là
biểu thức hoặc khối lệnh. Trong C# 3.5, toán tử lambda kí hiệu là =>. Một biểu thức
lambda thường giống như sau:
(parameter 1, parameter 2,…, parameter N) => expression
Hoặc:
(parameter 1, parameter 2,…, parameter N) =>
{
Tìm hiểu công nghệ lập trình LINQ trong Visual Studio 2010

9

Statement 1;
Statement 2;

Statement N;

return(variable);
}
Sau đây là một ví dụ về biểu thức lambda: x => y
Biểu thức này có nghĩa là chúng ta đưa vào tham số là x và lấy ra kết quả là giá trị
y. Điều quan trọng chúng ta cần biết, đây chính là một delegate. Delegate này chỉ rõ kiểu
của biến x được đưa vào và kiểu biến y được trả về.
Một ví dụ cho một biểu thức lambda phức tạp hơn như sau:
(x, y) =>
{
if (x > y)
return (x);
else
return (y);
}
Điều quan trọng là bạn phải nhớ rõ các kiểu tham số nhập vào và kiểu giá trị trả
về mà delegate đã định nghĩa. Vì vậy chúng ta phải chắc chắn biểu thức lambda phải phù
hợp với định nghĩa delegate.
Ví dụ 1-1: Đây là một ví dụ lọc các giá trị lẻ trong một mảng số nguyên có sử
dụng biểu thức lambda

class Common
{
public delegate bool IntFilter(int i);
Tìm hiểu công nghệ lập trình LINQ trong Visual Studio 2010

10


public static int[] FilterArrayOfInts(int[] ints, IntFilter filter)
{

ArrayList aList = new ArrayList();
foreach(int i in ints)
if(filter(i))
{
aList.Add(i);
}
return ((int[])aList.ToArray(typeof(int)));
}
}

class Program
{
static void Main(string[] args)
{
int[] nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int[] oddNums = Common.FilterArrayOfInts(nums, x =>(x & 1) == 1);

foreach(int i in oddNums)
{
Console.WriteLine(i);
}
}
}


Tìm hiểu công nghệ lập trình LINQ trong Visual Studio 2010

11



Cách viết câu truy vấn theo nhưng phương thức khác nhau
int[] oddNums = // using named method
Common.FilterArrayOfInts(nums, Application.IsOdd);

int[] oddNums = // using anonymous method
Common.FilterArrayOfInts(nums, delegate(int i){return((i & 1) == 1);});

int[] oddNums = // using lambda expression
Common.FilterArrayOfInts(nums, i => ((i & 1) == 1));

1.4.3. Kết hợp cả 2 dạng trên (Combine syntax)
static void Main(string[] args)
{
int[] numbers = { 2, 5, 28, 31, 17, 16, 42 };

var numsQuery = from n in numbers //Query syntax
where n < 20
select n;
var numsMethod = numbers.Where(x => x < 20);//Method syntax

int numsCount = (from n in numbers //Combine
where n < 20
select n).Count();
foreach (var x in numsQuery)
Console.Write("{0},",x);
Tìm hiểu công nghệ lập trình LINQ trong Visual Studio 2010

12

Console.WriteLine();


foreach (var x in numsMethod)
Console.Write("{0},",x );
Console.WriteLine();

Console.WriteLine(numsCount);
}


Tìm hiểu công nghệ lập trình LINQ trong Visual Studio 2010

13

2. LINQ TO OBJECT
2.1. Giới thiệu
“LINQ to Objects” ở đây có nghĩa là nói đến cách sử dụng LINQ đối với các đối
tượng Collection mà đã được thực thi giao diện IEnumerable hoặc
IEnumerable<T> tức những collection có thể “liệt kê” ra được. Đây là trường
hợp sử dụng đơn giản nhất của LINQ khi làm việc với dữ liệu.

Các kiểu Collection có sẵn trong .NET như List<T>, Array, Dictionary<TKey,
TValue>, … đều có thể sử dụng được với LINQ và chúng ta hoàn toàn có thể tạo
những kiểu Collection có thể làm việc được với LINQ.

Về mặt hình thức, LINQ là một cách thể hiện của các vòng lặp for, foreach.
Nhưng về thực tế LINQ đem lại nhiều lợi ích hơn:

1. Cách viết dễ dàng cho việc đọc và phân tích. Trường hợp này sẽ được thể
hiện rõ ràng khi chúng ta cần lọc những dữ liệu với nhiều điều kiện phân cấp
nhau thì LINQ sẽ thể hiện rõ tính ưu việt.


2. LINQ cũng cung cấp những bộ lọc, sắp xếp thứ tự, nhóm dữ liệu với khối
lượng code tối thiểu nhưng vẫn bảo đảm tính rõ ràng như ở trên.

3. Trong trường hợp chúng ta cần chuyển dữ liệu từ nguồn dữ liệu này sanng
nguồn dữ liệu khác, thì LINQ sẽ giảm thiểu sự thay đổi của dữ liệu trong quá
trình di chuyển.


2.2. Truy vấn với một mảng
Khi sử dụng LINQ để truy vấn các tập hợp không có đặc điểm chung
IEnumerable như ArrayList, bạn phải khai báo rõ ràng kiểu phạm vi của các biến để
phản ánh cụ thể của các loại đối tượng trong tập hợp.

Tìm hiểu công nghệ lập trình LINQ trong Visual Studio 2010

14

Một ví dụ đơn giản về cách sử dụng LINQ đối với một kiểu mảng thông thường
int[] numbers = { 1, 2, 5, 2, 8, 5, 9, 4, 0, 5, 6 };
var evens = from n in numbers
where n % 2 == 0
select n;
foreach (int n in evens)
{
Console.WriteLine("{0}",n);
}

Trong ví dụ, có một mảng số, công việc là cần lọc ra những số chẵn. Ví dụ trên
viết theo query expression. Có thể viết lại theo dạng extension method như sau:


var evens = numbers.Where(n => n % 2 == 0).Select(n => n);



2.3. Bộ lọc dữ liệu
Giả sử chúng ta có một lớp Employee như sau:
class Employee
{
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Country { get; set; }
}
Tìm hiểu công nghệ lập trình LINQ trong Visual Studio 2010

15


Và dữ liệu cho lớp Employee
var employees = new List<Employee>{
new
Employee{ID=1,FirstName="John",LastName="Wright",Country="USA"},
new Employee{ID=2,FirstName="Jim",
LastName="Ashlock",Country="UK"},
new
Employee{ID=3,FirstName="Jane",LastName="Jackson",Country="CHE"},
new
Employee{ID=4,FirstName="Jill",LastName="Anderson",Country="AUS"},
};


Muốn tìm các nhân viên theo ID nào đó có thể bắt đầu bằng một phương pháp là
lấy danh sách tất cả nhân viên và trả về danh sách lọc nhân viên theo một ID mà chúng ta
muốn tìm.
static List<Employee> GetEmployeeWithEvenID(List<Employee> employees)
{
var filteredEmployees = new List<Employee>();
foreach (Employee emp in employees)
{
if (emp.ID % 2 == 0)
{
filteredEmployees.Add(emp);
}
}
return filteredEmployees;
}


Tìm hiểu công nghệ lập trình LINQ trong Visual Studio 2010

16

Phương pháp trên có thể viết lại để trả về một IEnumerable<Employee> như sau:
static IEnumerable<Employee>
GetEmployeeWithEvenID(IEnumerable<Employee> employees)
{
foreach (Employee emp in employees)
{
if (emp.ID % 2 == 0)
{

yield return emp;
}
}
}


2.4. Phép chiếu
Để cho phép liệt kê các mục trong IEnumerable<Employee>
public

class

Employees

{
public int ID { get; set; }
public string firstName { get; set; }
public string lastName { get; set; }
public string Country { get; set; }
}
nhận được từ phương thức “Where”
static

IEnumerable
<T> Where<T>(
IEnumerable
<T> source,
Func
<T,
bool

> filter)

{
foreach (var x in source)
{
if (filter(x))
{
yield return x;
}
}
}


Tìm hiểu công nghệ lập trình LINQ trong Visual Studio 2010

17

Và sao chép chúng vào một IEnumerable<FormatEmployees>. Lớp
IEnumerable<FormatEmployees > sẽ chỉ có thuộc tính FullName và ID.
public

class

FormatEmployees

{
public int ID { get; set; }
public string Name { get; set; }
}


Chúng ta có thể “chiếu” IEnumerable<Employee> vào một tập mới,
IEnumerable<EmployeeFormatted>, với sự giúp đỡ của một phương thức mới. Chúng ta
gọi đó là phương thức “Select”.
static

IEnumerable
<
FormatEmployees
> Select(
IEnumerable
<
Employees
> employees)

{
foreach (var emp in employees)
{
yield return new FormatEmployees
{
ID = emp.ID,
Name = emp.lastName + " " + emp.firstName
};
}
}

static

void

Main(

string
[] args)

{
var employees=new List<Employees>{
new Employees{ID=1,firstName="John",lastName="Wright",Country="USA"},
new Employees{ID=2,firstName="Jim",lastName="Ashlock",Country="UK"},
new Employees{ID=3,firstName="Jane", lastName="Jackson", Country="CHE"},
new Employees{ID=4,firstName="Jill",lastName="Anderson",Country="AUS"}};

var filterEmployees = Where(employees, emp => emp.ID % 2 == 0);
var formattedEmployees = Select(filterEmployees);
foreach(FormatEmployees emp in formattedEmployees)
{
Console.WriteLine("ID {0} Name {1}",emp.ID,emp.Name);
}
}



Tìm hiểu công nghệ lập trình LINQ trong Visual Studio 2010

18

Đây là phương thức “Select” chung chung để người dùng có thể hình dung nó
hoạt động như thế nào. Chúng ta có thể thay đổi nó để nó chấp nhận delegate, giống như
với phương thức “Where” mà chúng ta đã làm.

static IEnumerable<TResult> Select<TSource, TResult>(IEnumerable<TSource> source, Func<TSource, TResult> selector)
{

foreach (var x in source)
{
yield return selector(x);
}
}

static

void

Main(
string
[] args)

{
var employees=new List<Employees>{
new Employees{ID=1,firstName="John",lastName="Wright",Country="USA"},
new Employees{ID=2,firstName="Jim",lastName="Ashlock",Country="UK"},
new Employees{ID=3,firstName="Jane", lastName="Jackson", Country="CHE"},
new Employees{ID=4,firstName="Jill",lastName="Anderson",Country="AUS"}};

var filterEmployees = Where(employees, emp => emp.ID % 2 == 0);
var formattedEmployees = Select(filterEmployees, (emp) =>
new FormatEmployees { ID = emp.ID, Name = emp.lastName + " " + emp.firstName });

foreach(FormatEmployees emp in formattedEmployees)
{
Console.WriteLine("ID {0} Name {1}",emp.ID,emp.Name);
}
}




Chúng ta có thể kết hợp 2 dòng:
var

filterEmployees = Where(employees, emp => emp.ID % 2 == 0);

var formattedEmployees = Select(filterEmployees, (emp) =>
new FormatEmployees { ID = emp.ID, Name = emp.lastName + " " + emp.firstName });

Thành một dòng như sau:
var

formattedEmployees = Select(Where(employees, emp => emp.ID % 2 == 0), (emp) =>
new FormatEmployees { ID = emp.ID, Name = emp.lastName + " " + emp.firstName });


Tìm hiểu công nghệ lập trình LINQ trong Visual Studio 2010

19

2.5. Phương thức Extension
Được định nghĩa trong một lớp tĩnh.
public

static

class


MyE
xtensionMethods

{
public static IEnumerable<T> Where<T>(this IEnumerable<T> source, Func<T,
bool> filter)
{
foreach (var x in source)
{
if (filter(x))
{
yield return x;
}
}
}
public static IEnumerable<TResult> Select<TSource, TResult>(this
IEnumerable<TSource> source, Func<TSource, TResult> selector)
{
foreach (var x in source)
{
yield return selector(x);
}
}

}
Việc tạo ra phương thức Extension làm cho cú pháp của chúng ta gọn gàng hơn.
Chúng ta có thể viết nhiều phương thức Extension nếu chúng ta muốn.

var


formattedEmployees = employees

.Where(emp => emp.ID % 2 == 0)
.Select(emp => new { ID = emp.ID, Name = emp.lastName + " " + emp.firstName});
C# cho phép chúng ta viết các phương thức Extension như là biểu thức truy vấn.
var

formattedEmployees =
from

emp
in

employees

where emp.ID % 2 == 0
select new { ID = emp.ID, Name = emp.lastName + " " +
emp.firstName };

Khi trình biên dịch gặp phải một biểu thức như trên, nó chỉ đơn giản là viết lại
phương thức Extension của chúng ta. Trong namespace System.Linq có chứa một số
phương thức Extension cho đối tượng thực thi IEnumerable<T>. Chúng ta có thể thấy các
phương thức này trong lớp Enumerable. Bây giờ, chúng ta thử loại bỏ các phương thức
Extension của chúng ta và sử dụng các phương thức được cung cấp trong lớp
Enumerable.
Tìm hiểu công nghệ lập trình LINQ trong Visual Studio 2010

20

using


System;

using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication9
{
class Program
{
static void Main(string[] args)
{
var employees = new List<Employees>{
new Employees{ID=1,firstName="John",lastName="Wright",Country="USA"},
new Employees{ID=2,firstName="Jim",lastName="Ashlock",Country="UK"},
new Employees{ID=3,firstName="Jane", lastName="Jackson",
Country="CHE"},
new
Employees{ID=4,firstName="Jill",lastName="Anderson",Country="AUS"}};


var formattedEmployees = from emp in employees
where emp.ID % 2 == 0
select new { ID = emp.ID, Name =
emp.lastName + " " + emp.firstName };
foreach (var emp in formattedEmployees)
{
Console.WriteLine("ID {0} Name {1}", emp.ID, emp.Name);
}

Console.ReadLine();
}
}
}

public class Employees
{
public int ID { get; set; }
public string firstName { get; set; }
public string lastName { get; set; }
public string Country { get; set; }
}

public class FormatEmployees
{
public int ID { get; set; }
public string Name { get; set; }
}


Tìm hiểu công nghệ lập trình LINQ trong Visual Studio 2010

21

3. LINQ to XML
3.1. Giới thiệu về LINQ to XML
LINQ to XML cung cấp giao diện lập trình XML mà đòn bẩy là .NET LINQ
Framework. LINQ to XML sử dụng ngôn ngữ mới nhất của .NET Framework và được
so sánh và thiết kế lại với giao diện lập trình XML Document Object Model (DOM).
LINQ to XML cũng giống như Document Object Model (DOM) ở chỗ nó chuyển

các tài liệu XML vào bộ nhớ. Bạn có thể truy vấn và sửa đổi các tài liệu, và sau khi bạn
chỉnh sửa nó, bạn có thể lưu nó vào một tập tin hoặc xuất nó ra. Tuy nhiên, LINQ to
XML khác DOM: Nó cung cấp mô hình đối tượng mới đơn giản hơn và dễ thao tác hơn
để làm việc , và đó là tận dụng các cải tiến ngôn ngữ trong Visual C # 2010.
Khả năng sử dụng kết quả truy vấn là tham số cho đối tượng XElement và
XAttribute cho phép một phương pháp mạnh mẽ để tạo ra cây XML. Phương pháp này,
được gọi là functional construction, cho phép các nhà phát triển để dễ dàng chuyển đổi
cây XML từ một hình dạng này sang hình dạng khác.
Sử dụng LINQ to XML bạn có thể:
 Load XML từ nhiều file hoặc luồng.
 Xuất XML ra file hoặc luồng.
 Truy vấn cây XML bằng những truy vấn LINQ.
 Thao tác cây XML trong bộ nhớ.
 Biến đổi cây XML từ dạng này sang dạng khác.

3.2. Mô hình LINQ to XML

LINQ to XML chứa rất nhiều những lớp mới được lưu trữ trong namespace
System.Xml.Linq. Một trong số đó là lớp Extensions dùng cho extension method và hai
lớp so sánh XNodeDocumentOrderComparer và XnodeEqualityComparer. Phần còn lại
được sử dụng để tạo XML tree. Những lớp này được liệt kê bên dưới
Tìm hiểu công nghệ lập trình LINQ trong Visual Studio 2010

22


Mô hình đối tượng LINQ to XML API
Có một số điểm chúng ta cần lưu ý như sau:
1. Object, XContainer, và XNode là ba lớp trừu tượng, vì vậy chúng ta
không bao giờ khởi dựng nó.

2. XAttribute không kế thừa từ một node nên nó hoàn toàn không phải là một
node mà chỉ là một cặp tên và giá trị cơ bản.
3. XStreamingElement không có bất cứ một quan hệ kế thừa nào với
XElement.
4. XDocument và XElement chỉ chứa những node con bắt nguồn từ XNode.
Trên đây là những lớp bạn sử dụng để tạo XML tree. Đáng chú ý nhất bạn sẽ sử
dụng rất nhiều lớp XElement, bởi vì chúng ta đã thảo luận từ trước, LINQ to XML là
element-centric, ngược lại W3C DOM là document-centric.
3.3. Xây dựng một cây XML
3.3.1. Tạo một phần tử XML
Cấu trúc
XElement(XName , object )
XElement(XName)
XName: tên phần tử.
Object: nội dụng của phần tử.
Tìm hiểu công nghệ lập trình LINQ trong Visual Studio 2010

23

Ví dụ sau tạo phần tử <Customer>có nội dung “Adventure Works”.
C#

XElement n = new XElement("Customer", "Adventure Works");

Console.WriteLine(n);
Xml

<Customer>Adventure Works</Customer>



Tạo phần tử rỗng để trống phần nội dung
C#

XElement n = new XElement("Customer");

Console.WriteLine(n);
Xml

<Customer />


3.3.2. Tạo một thuộc tính cho phần tử XML:
Cấu trúc
XAttribute(XName, object)

XName: thuộc tính.
object: giá trị của thuộc tính.

Tìm hiểu công nghệ lập trình LINQ trong Visual Studio 2010

24

C#

XElement phone = new XElement("Phone",

new XAttribute("Type", "Home"),
"555-555-5555");
Console.WriteLine(phone);
Xml


<Phone Type="Home">555
-
555
-
5555</Phone>


3.3.3. Tạo ghi chú trong cây XML:
Tạo một phần tử gồm một chú thích như một nút con
Tên
XComment(String)

C#

XElement root = new XElement("Root", new XComment("This is a comment"));

Console.WriteLine(root);

Xml

<Root>

<! This is a comment >
</Root>
Tìm hiểu công nghệ lập trình LINQ trong Visual Studio 2010

25

3.3.4. Xây dựng một cây XML.

Sử dụng đối tượng XDocument xây dựng một cây XML. Thông thường ta có thể
tạo ra cây XML với nút gốc XElement.
Name Description
XDocument() Initializes a new instance of the XDocument class.
XDocument(Object[]) Initializes a new instance of the XDocument class
with the specified content.
XDocument(XDocument) Initializes a new instance of the XDocument class
from an existing XDocument object.
XDocument(XDeclaration,
Object[])
Initializes a new instance of the XDocument class
with the specified XDeclaration and content.


static void Main(string[] args)
{
XElement books = XElement.Parse(
@"<books>
<book>
<title>Pro LINQ: Language Integrated Query in C# 2010</title>
<author>Joe Rattz</author>
</book>
<book>
<title>Pro .NET 4.0 Parallel Programming in C#</title>
<author>Adam Freeman</author>
</book>
<book>
<title>Pro VB 2010 and the .NET 4.0 Platform</title>

×