You are on page 1of 122

n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 1

Mc lc
I. Gii thiu v LINQ. ..................................................................................................... 6
II. Gii thiu v cc truy vn LINQ. ................................................................................ 7
II.1 Ba phn ca mt biu thc LINQ. ............................................................................ 7
II.2 Cc d liu ngun. .................................................................................................... 9
II.3 Truy vn. ................................................................................................................. 10
II.3 Thc thi truy vn. .................................................................................................... 10
II.4 Thc thi bt buc tc thi. ...................................................................................... 11
III. Tng quan v thit k O / R. ........................................................................................ 11
III.1 M cc O / R Designer. ......................................................................................... 12
III.2 Cu hnh v to ra DataContext ............................................................................. 12
III.3 To t chc cc lp m c s d liu bn bn v xem. ............................... 13
III.4 DataContext to ra phng php gi th tc lu tr v cc hm. ......................... 13
III.5 Cu hnh mt DataContext s dng cc th tc lu tr d liu lu d liu gia
cc lp thc th v c s d liu. .................................................................................. 13
III.6 Tha k v cc O / R Designer .............................................................................. 13
IV. Cc truy vn LINQ to SQL. .................................................................................... 13
IV.1 Tch ri DataContext to ra v cc lp thc th vo cc namespaces khc
nhau ............................................................................................................................... 14
IV.2 Lm th no : Ch nh lu tr Thc hin th tc Update, Insert, v delete ..... 14
V. LINQ v cc kiu c chung c im ....................................................................... 14
V.1 IEnumerable cc bin trong cc cu truy vn LINQ .............................................. 15
V.2 Cho php chng trnh bin dch x l cc loi khai bo chung ........................... 15
V.3 Hot ng truy vn c bn. ..................................................................................... 16
V.3.1 Obtaining a Data Source .................................................................................. 16
V.3.2 Filtering( Lc) .................................................................................................. 17
V.3.3 Ordering (Th t) ............................................................................................ 17
V.3.4 Grouping .......................................................................................................... 17
V.3.5 Joining.............................................................................................................. 18
V.3.6 Selecting (Projections) ..................................................................................... 19
V.4 Chuyn i d liu vi LINQ ..................................................................................... 19
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 2

V.4.1 Tham gia vo nhiu yu t u vo xut ra mt trnh t. .................................... 20
V.4.2 La chn mt tp hp con ca mi phn t ngun ............................................. 21
V.4.3 Chuyn i cc i tng trong b nh vo XML.............................................. 22
V.4.4 Thc hin cc hot ng trn cc phn t ngun. ............................................... 23
V.4.5 Loi cc quan h trong thao tc truy vn. ............................................................ 24
V.5.6 Truy vn m khng chuyn ha cc ngun d liu ............................................. 24
V.5.7 Trnh bin dch phi suy lun ra cc loi thng tin ............................................. 25
V.6 C php truy vn vs c php phng thc. ................................................................ 26
V.6.1 Ton t truy vn chun m rng cc phng thc .............................................. 26
V.6.2 Biu thc Lambda ................................................................................................ 28
V.7 Cc c trng c LINQ h tr trong C#3.0 ........................................................... 29
V.7.1 Biu thc truy vn. .............................................................................................. 29
V.7.2 Implicitly Typed Variables (var) ......................................................................... 30
V.7.3 i tng, v tp hp cc gi tr u vo ............................................................ 30
V.7.4 Cc loi cha xc nh ......................................................................................... 30
V.7.5 Cc phng thc m rng ................................................................................... 31
V.7.6 Cc thuc tnh t ng thi hnh ........................................................................... 31
V.8 Vit cu truy vn trong C# ......................................................................................... 31
V.8.1 thm cc d liu ngun ...................................................................................... 31
V.9 To cc truy vn .......................................................................................................... 32
V.9.1 to mt truy vn n gin .............................................................................. 32
V.9.2 thc hin cc truy vn .................................................................................... 33
V.9.3 thm mt iu kin lc ................................................................................... 33
V.9.4 Chnh sa truy vn ............................................................................................... 33
V.9.5 nhm cc kt qu ........................................................................................... 34
V.9.6 To order the groups by their key value ................................................................ 34
V.9.7 gii thiu mt nh danh bng cch s dng let ............................................ 34
V.9.8 s dng c php phng thc trong mt biu thc truy vn ......................... 35
V.9.9 chuyn i hoc d n trong mnh select ................................................. 35
VI. LINQ to SQL ........................................................................................................... 36
VI.1 Kt ni ................................................................................................................... 37
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 3

VI.2 Giao dch ............................................................................................................... 38
VI.3 Lnh SQL trc tip ................................................................................................ 39
Cc tham s ................................................................................................................... 39
VI.4 Cch kt ni mt c s d liu (LINQ to SQL) .................................................... 39
VI.5 Cch to c s d liu (LINQ to SQL) ................................................................. 41
VI.6 Bn c th lm g vi LINQ to SQL ..................................................................... 43
VI.6.1 La chn(Select) ............................................................................................ 43
VI.6.2 Cch chn hng vo trong c s d liu (LINQ to SQL) .............................. 43
VI.6.3 Chn mt hng vo c s d liu ................................................................... 44
VI.6.4 Cch cp nht hng trong c s d (LINQ to SQL) ...................................... 45
VI.6.5 Cp nht .............................................................................................................. 46
VI.7 Cch xa hng trong c s d liu (LINQ to SQL) .......................................... 47
Xa ................................................................................................................................. 50
VI.8 Quy trnh lu tr (LINQ to SQL) .......................................................................... 50
VI.8.1 Chn, cp nht v xa cc hot ng ca c s d liu trong LINQ to SQL .... 51
VI.8.2 Cch gi nhng thay i n c s d liu (LINQ to SQL) .............................. 52
VI.8.3 To cc lp LINQ to SQL c nh x vo bng c s d liu or cc khung
nhn. ............................................................................................................................... 54
VI.8.4 to cc lp c nh x vo d liu bng hoc cc khung nhn trong LINQ
to SQL. ........................................................................................................................... 54
VII. LINQ to XML ......................................................................................................... 55
VII.1 nh ngha. ........................................................................................................... 55
VII.2 Thm vo trong khi lp. ....................................................................................... 56
VII.3 Xa trong khi lp.................................................................................................. 57
VII.4 Ti sao khng th x l LINQ t ng? ............................................................. 58
VII.5 Lm th no : vit mt phng thc axis LINQ to XML. ............................... 59
VII.6 Cch to mt ti liu vi Namespaces (LINQ to XML) (C#) ............................. 67
VII.7 Cch Stream XML Fragments t mt XmlReader .............................................. 69
VII.8 Cch to mt s (Tree) t mt XmlReader..................................................... 71
VII.9 Thay i cy XML trn b nh trong so vi Functional Construction (LINQ to
XML) ............................................................................................................................. 72
VII.10 Chuyn i thuc tnh vo cc phn t. ............................................................. 73
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 4

VII.10.1 Chnh sa mt cy XML. ................................................................................ 73
VII.10.2 Cch tip cn Functional Construction. .......................................................... 73
VII.10.3 Removing Elements, Attributes, and Nodes from an XML Tree ................... 74
Code ........................................................................................................................... 76
VII.10.4 Lm th no : Lc trn mt Ty chn Element. ......................................... 77
VII.10.5 Lm th no : Tm mt n Descendant r Phng thc s dng. ............ 79
VII.10.6 Lm th no : Tm tt c cc Nodes trong mt Namespace. ....................... 79
VII.10.7 Lm th no : Tm mt phn t vi phn t c th. .................................... 80
VII.10.8 Lm th no : Tm mt Element vi mt thuc tnh c th. ....................... 81
VII.10.9 Lm th no : Tm Descendants vi mt c th Element namespace. ........ 81
VII.10.10 Lm th no : To vn bn t tp tin XML. .............................................. 82
VII.10.11 Lm th no : to ra h ng cp bng cch s dng nhm. .................... 83
VII.10.12 Lm th no : Join hai b su tp. ............................................................ 83
VII.10.13 Lm th no : Load XML t mt tp. ....................................................... 85
VII.11 Sa i XML Trees............................................................................................ 85
VII.11.1 Lm th no : Vit mt truy vn m cc phn t da trn bi cnh. .......... 86
VII.11.2 Lm th no : Vit truy vn vi lc phc tp.............................................. 88
VII.11.3 Lm th no : Truy vn LINQ s dng XML xpath. ............................. 89
VII.11.4 Lm th no : Xp sp cc phn t. ............................................................ 89
VII.11.5 Lm th no : xp sp cc phn t c nhiu kha. ...................................... 90
VII.11.6 Lm th no : Xp sp theo chnh sch thc hin chuyn i ca ti liu
XML ln. ....................................................................................................................... 90
VII.11.7 Lm th no :truy cp lung XML phn mnh vi thng tin cho tiu . .. 93
VII.12 So snh cc Xpath v LINQ to XML................................................................. 96
VIII. LINQ to Objects ................................................................................................... 97
VIII.1 Lm th no : Truy vn vi mt ArrayList LINQ .......................................... 98
VIII.2 LINQ and Strings ................................................................................................ 99
VIII.3 Lm th no : m s xut hin ca mt t trong mt chui (LINQ) ........... 99
VIII.4 Lm th no : Truy vn cho cu cha mt b t. .................................... 101
VIII.5 Lm th no : Truy vn cho cc k t trong mt String (LINQ) .................. 102
VIII.6 Lm th no : Kt hp LINQ truy vn vi cc biu thc chnh quy. .......... 103
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 5

VIII.7 Cu hi bn cu trc d liu nh dng vn bn ........................................... 104
VIII.7.1 Lm th no : Tm cc tp khc bit gia hai danh sch (LINQ) .............. 105
VIII.7.2 Lm th no : Sp xp hay Lc d liu Vn bn bi bt k mt t hoc mt
trng (LINQ) ............................................................................................................. 105
VIII.7.3 Lm th no : Sp xp li cc trng c nh gii trong file. ............... 106
VIII.8 to cc tp d liu ....................................................................................... 106
VIII.8.1 Lm th no : Kt hp v so snh cc tp hp chui (LINQ) ................... 107
VIII.8.2 Lm th no : Ly ra tp hp i tng t nhiu ngun (LINQ) .............. 108
VIII.8.3 Lm th no : Gia nhp ni dung t cc file khng cng dng. ................ 110
VIII.8.4 Lm th no : Tch mt file vo cc file bng cch s dng cc nhm
(LINQ) ......................................................................................................................... 110
VIII.8.5 Lm th no : Tnh ton gi tr ca ct trong mt vn bn ca tp CSV
(LINQ) ......................................................................................................................... 111
IX. LINQ to ADO.NET ............................................................................................... 113
X. LINQ to DataSet ...................................................................................................... 114
X.1 Tng quan v LINQ to DataSet. ........................................................................... 115
X.2 Truy vn cc DataSet s dng LINQ DataSet ................................................. 116
X.3 ng dng N-tier v LINQ to DataSet .................................................................. 117
X.4 ang ti d liu vo mt DataSet ......................................................................... 118
X.5 Truy vn cc DataSet ............................................................................................ 119
X.6 truy vn trong LINQ to DataSet. ..................................................................... 120









n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 6




I. Gii thiu v LINQ.
LINQ l vit tt ca t Language Integrated Query tm dch l ngn ng tch
hp truy vn l mt s i mi trong Visual Studio 2008 v .NET Framework 3.5 l cu
ni khong cch gia th gii ca cc i tng vi th gii ca d liu.
Theo truyn thng cc cu truy vn trn d liu c th hin mt cch d dng
ging nh cc chui k t n gin m khng cn n kiu kim tra ti thi im bin
dch hoc s h tr ca trnh h tr trc quan. Hn na bn cn phi tm hiu mt ngn
ng truy vn khc nhau cho mi loi d liu liu ngun khc nhau nh: C s d liu
SQL, ti liu XML, cc dch v Web. LINQ lm cho mt truy vn mt lp u tin xy
dng trong ngn ng C# v Visual Basic. Bn vit mt cu truy vn da trn tp hp cc
i tng bng cch s dng ngn ng, cc t kha cc ton t quen thuc. V d minh
ha sau y cho thy mt phn cu truy vn c hon thnh da trn c s d liu SQL
Server trong C# vi y loi kim tra v s h tr ca trnh h tr trc quan.

n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 7

Trong Visual Studio 2008 bn c th vit cc cu truy vn LINQ trong Visual
Basic hoc C# vi c s d liu SQL Server, cc ti liu XML, ADO.NET Datasets v
bt k tp i tng c h tr IEnumerable hoc c c im chung ging giao din
IEnumerable<T>. LINQ h tr cho cc thc th ADO.NET Framework v LINQ ang
c cc nh cung cp hin nay vit bi bn th ba cho nhiu dch v Web v cc trin
khai d liu khc. Bn c th s dng cc truy vn LINQ trong cc d n mi hoc trong
cc d n hin c. Mt yu cu duy nht l cc d n c xy dng trn .NET
Framework 3.5.
II. Gii thiu v cc truy vn LINQ.
Mt cu truy vn l mt biu thc gi ra d liu t d liu ngun. Cu truy vn
thng ni r trong ngn ng truy vn c thit k cho mc dch ring. Cc ngn
ng khc nhau c pht trin theo thi gian cho cc loi d liu ngn, v d nh SQL
dnh cho c s d liu quan h v XQuery dnh cho XML. V vy cc nh pht trin
tm hiu mt ngn ng truy vn mi cho cc loi d liu ngun hoc cc nh dng m
h phi h tr. LINQ n gin tnh trng ny bng cch cung cp mt m hnh nht qun
lm vic vi cc loi d liu ngun khc nhau v cc nh dng. Trong mt truy vn
LINQ bn phi lun lun lm vic vi cc i tng. Bn s dng ging nh truy vn
mu c bn m ha v chuyn i d liu trong cc ti liu XML, c s d liu SQL,
ADO.NET DataSet v cho bt k mt nh ng no m mt nh cung cp LINQ c sn.
II.1 Ba phn ca mt biu thc LINQ.
Tt c cc biu thc LINQ lm vic theo ba thao tc.
1. C c cc d liu ngun.
2. To cc truy vn.
3. Thc hin cc truy vn.
V d trong m ngun sau y cho thy ba phn ca mt truy vn hot ng nh th
no. V d s dng mt mng s nguyn nh l mt s thay th cho ngun d liu; tuy
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 8

nhin, trong cng mt khi nim p dng cho cc ngun d liu khc cng c. V d ny
s c gii thiu n trong sut phn cn li ca ch ny.
class IntroToLINQ
{
static void Main()
{
// The Three Parts of a LINQ Query:
// 1. Data source.
int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };

// 2. Query creation.
// numQuery is an IEnumerable<int>
var numQuery =
from num in numbers
where (num % 2) == 0
select num;

// 3. Query execution.
foreach (int num in numQuery)
{
Console.Write("{0,1} ", num);
}
}
}

Minh ha sau y cho thy cc hot ng truy vn tm kim c hon tt. Trong
LINQ vic thc hin cc truy vn ring bit t bn thn cu truy vn. Ni cch khc bn
khng ly ra bt k d liu no bng cch to ra mt bin truy vn.
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 9


II.2 Cc d liu ngun.
Trong v d trc v d liu l mt mng, n hon ton h tr c im chung
giao din IEnumerable <T>. iu ny c ngha thc t n c th c truy vn vi
LINQ. Mt truy vn c thc hin trong mt cu lnh foreach v foreach yu cu
IEnumerable hay IEnumerable(T). Loi c h tr IEnumerable(T) hoc mt giao din
nh IQueryable(T) c gi l cc loi queryable. Mt loi queryable khng yu cu
phi sa i hay x l c bit phc v mt LINQ ngun d liu. Nu cc ngun d
liu khng phi l c trong b nh nh l mt loi queryable, mt nh cung cp LINQ
phi i din cho n nh vy. V d, LINQ to XML mt ti liu XML vo mt queryable
XElement:
// Query execution.
foreach (int num in numQuery)
{
Console.Write("{0,1} ", num);
}
Vi LINQ to SQL trc tin bn to mt i tng quan h c nh x vo lc
thit k ci ny c lm th cng hoc bng cch s dng trnh thit k i tng quan
h(O/R Designer). Bn vit cc cu truy vn ca bn da trn i tng v thi hnh
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 10

LINQ to SQL s l cc giao tip vi c s d liu. Trong v d sau, Customer i din
cho mt bng trong c s d liu, v Table<Customer> h tr cc c tnh chung
IQueryable<T> m c bt u t IEnumerable<T>.

// Create a data source from a SQL Server database.
// using System.Data.Linq;
DataContext db = new DataContext(@"c:\northwind\northwnd.mdf");

II.3 Truy vn.
Truy vn trong v d trc tr v tt c cc s t mng s nguyn. Cc biu thc
truy vn cha ba mnh : from, where, select.(Nu bn ang quen vi SQL sp t ca
cc mnh l sai v tr trong SQL). Mnh from dng xc nh ngun d liu,
mnh where dng lc d liu, mnh select dng chn ra nhng phn t c
tr v. cc mnh ny v cc mnh truy vn khc s c tho lun chi tit trong
phn LINQ Query Expresstions(Hng dn lp trnh C#). Lc ny mt im quan trng
l trong LINQ, cc bin truy vn tu n khng hnh ng v tr v khng c d liu. N
ch cha ng thng tin l yu cu t kt qu tr v khi cu truy vn c thc hin
ti mt s im sau.
II.3 Thc thi truy vn.
Hon thc thi.
Cng ging nh trng thi trc y, bin truy vn t n ch cha cc lnh truy
vn. Hin nay s thc thi ca cc truy vn l hon li n tn khi bn nhc li i vi
bin truy vn trong cu lnh foreach. Ci ny lm c s quy cho hon thc thi v l ci
in hnh trong v d sau:
// Query execution.
foreach (int num in numQuery)
{
Console.Write("{0,1} ", num);
}
Cu lnh foreach l ni cc kt qu truy vn c tr v v d cc truy vn trc
bin num c lp v nm d mi gi tr trong trnh t tr v. Bi cc bin truy vn t
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 11

n khng bao gi cha kt qu truy vn, bn c th thc hin n thng xuyn nh bn
mun. V d bn dang c mt c s d liu m ang c cp nhp lin tc bi mt ng
dng ring bit. Trong ng dng ca bn, bn c th to mt truy vn ly ra d liu
mi nht v bn c th thi hnh n mt cch lin tc ti mt khong thi gian ly kt
qu mi ln.
II.4 Thc thi bt buc tc thi.
Truy vn m s kt hp thc hin cc chc nng trn mt lot cc phn t ngun
u tin phi lp i lp li trn nhng nhn t. V d nh cc truy vn Count, Max,
Average, v First. Nhng thc thi m khng c mt cu lnh foreach no r rng bi v
cc truy vn t n phi s dng foreach tr v l mt kt qu. Cng lu rng cc loi
truy vn tr li mt gi tr, khng phi l mt tp IEnumerable. Cc truy vn sau y s
tr v mt s lng cc s trong mng ngun:
var evenNumQuery =
from num in numbers
where (num % 2) == 0
select num;
int evenNumCount = evenNumQuery.Count();

List<int> numQuery2 =
(from num in numbers
where (num % 2) == 0
select num).ToList();
// or like this:
// numQuery3 is still an int[]
var numQuery3 =
(from num in numbers
where (num % 2) == 0
select num).ToArray();
III. Tng quan v thit k O / R.
Thit k i tng quan h (O / R Designer) cung cp mt hnh nh thit k trc
quan cho vic to LINQ to SQL t chc cc thc th v s kt hp (cc mi quan h)
da trn cc i tng trong mt c s d liu. Ni cch khc, cc O / R c thit k s
dng to ra mt m hnh i tng trong mt ng dng nh x cc i tng trong
mt c s d liu. N cng to ra mt mnh kiu r rng DataContext c s dng
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 12

gi v nhn d liu gia cc lp thc th v c s d liu. O / R Designer cng cung cp
tnh nng cho vic nh x cc th tc lu tr v cc hm thc hin cc phng thc
trong DataContext tr v cc d liu v populating t chc cc lp thc th. Cui cng, O
/ R Designer cung cp kh nng thit k tha k cc mi quan h gia cc lp thc th.
O / R Designer to ra nhng file c phn m rng l .dbml cung cp cho vic nh
x gia cc lp LINQ to SQL v cc i tng d liu. O / R Designer cng to ra nhng
kiu DataContext v t chc cc lp thc th.
O / R Designer c hai khu vc ring bit trn b mt thit k: cc thc th trong
ca s bn tri, v cc phng thc trong ca s bn phi. Ca s cc thc th chnh l
b mt thit k lp thc th, cc s kt hp, v cc bc k tha. Cc phng thc trong
ca s bn phil b mt thit k c hin th DataContext cc phng thc nh x lu
tr cc th tc v hm.
III.1 M cc O / R Designer.
Bn c th m cc O / R bng cch thm mt class mi vo d n
O / R Designer l mt cch d dng nh x cc i tng bi v n ch h tr
nh x 1:1cc mi quan h. Ni cch khc, mt lp thc th c th ch c mt nh x
1:1trong mi quan h vi mt c s d liu hoc view. nh x phc tp, chng hn nh
nh x mt lp thc th tham gia vo mt bng, hin cha h tr. Ngoi ra, cc nh thit
k l mt sinh m t ng mt chiu. iu ny c ngha l ch thay i m bn thc hin
cc nh thit k b mt c phn nh trong cc tp tin code. Hng dn thay i
cc tp tin code khng c phn nh trong O / R Designer. Bt k thay i no m bn
lm th cng trong cc tp tin m c ghi khi thit k c lu v code l t phc
hi.
III.2 Cu hnh v to ra DataContext
Sau khi bn thm mt lp LINQ cho SQL cho mt mc d n v m O / R
Designer thit k, cc thit k b mt trng rng i din mt DataContext sn sng
c cu hnh. cc DataContext c cu hnh kt ni vi cc thng tin c cung cp
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 13

bi cc phn t u tin c ko vo cho vic thit k .. V vy, cc DataContext c
cu hnh bng cch s dng kt ni thng tin t cc phn t du tin c ko vo thit
k b mt thit k.
III.3 To t chc cc lp m c s d liu bn bn v xem.
Bn c th to cc lp thc th c nh x t cc bng v cc view bng cch
ko th cc c s d liu v cc view Server Explorer / Explorer Database ln cc O / R
Designer. Nh ch nh trong phn trc ca DataContext c cu hnh kt ni vi cc
thng tin c cung cp bi cc phn t u tin c ko th vo b mt thit k. Nu
mt mc sau m s dng mt kt ni khc s c thm vo O / R Designer, bn c th
thay i kt ni cho cc DataContext.
III.4 DataContext to ra phng php gi th tc lu tr v cc hm.
Bn c th to DataContext cha cc phng thc m gi (c nh x ti) cc
th tc v cc hm lu tr bng cch ko chng t Server Explorer / Explorer Database
ln cc O / R Designer. Cc th tc lu tr v cc hm c a vo cc O / R Designer
nh phng thc ca DataContext.
III.5 Cu hnh mt DataContext s dng cc th tc lu tr d liu lu d liu
gia cc lp thc th v c s d liu.
Nh nu trn, bn c th to DataContext cha cc phng thc gi cc th tc
lu tr v cc hm. Ngoi ra, bn cng c th ch nh cc th tc lu tr c s dng
mc nh cho LINQ to SQL thc hin hnh ng insert, update, v delete.
III.6 Tha k v cc O / R Designer
Ging nh cc i tng khc, cc lp LINQ to SQL c th s dng c k tha
v thu c t cc lp. Trong mt c s d liu, cc mi quan h tha k c to ra
trong mt s cch. O / R Designer h tr cc khi nim v n-bng k tha nh n
thng trin khai thc hin trong cc h thng.
IV. Cc truy vn LINQ to SQL.

n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 14

IV.1 Tch ri DataContext to ra v cc lp thc th vo cc namespaces
khc nhau
O / R Designer cung cp cho cc thuc tnh Context Namespace v Entity
Namespace trn DataContext. Nhng thuc tnh xc nh tn DataContext v cc lp
thc th c to ra. Theo mc nh, cc thuc tnh l trng rng v cc DataContext
v cc lp thc th c to ra vo ng dng ca namesapce. to ra cc m vo mt
namespace khc cc ng dng ca namespace, nhp mt gi tr vo trong thuc tnh
Context Namespace v / hoc Entity Namespace.
IV.2 Lm th no : Ch nh lu tr Thc hin th tc Update, Insert, v delete
Th tc lu tr c th c a vo cc O / R Designer v thc hin nh cc
phng thc in hnh trong DataContext. Chng cng c th c s dng ph quyt
cc phng thc mc nh trong LINQ to SQL thc hin hnh vi thm, cp nht, v
xa khi cc thay i u c lu t cc thc th t chc mt c s d liu (v d, khi
gi cc phng thc SubmitChanges).
Nu th tc lu tr ca bn tr v gi tr m cn phi c gi li cho client (v
d, gi tr tnh ton trong th tc lu tr), to ra tham s ca bn c lu tr trong cc
th tc. Nu bn khng th s dng tham s, vit mt phn phng thc mt phn ca
vic trin khai thc hin thay v da vo cc ph quyt c to ra bi cc O / R
Designer. Cc thnh vin c nh x to ra cc gi tr cho c s d liu cn phi
c thit lp thch hp cho cc gi tr sau khi hon tt thnh cng ca qua trnh INSERT
hoc UPDATE.
V. LINQ v cc kiu c chung c im
Cc cu truy vn LINQ c da trn cc loi c chung c im, c gii thiu
trong phin bn 2.0 ca. NET Framework. Bn khng cn phi c kin thc i vo tm
hiu su cc c im chung trc khi bn c th bt u vit truy vn. Tuy nhin, bn c
th mun hiu r hai khi nim c bn:
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 15

1. Khi bn to mt v d ca mt tp hp c chung c im nh List(T), bn thay th
"T" vi cc loi i tng trong danh sch s cha. V d, mt danh sch cc
xu k t c th hin nh List<string> , v mt danh sch Customer cc i
tng khch hng c th hin nh List<Customer>. Mt danh sch chung c
kiu sinh ng v cung cp nhiu li ch hn mt tp hp n ct gi cc phn t
ca chng nh i tng. Nu bn c gng thm mt Customer vo trong m
List<string> , bn s nhn c mt li ti thi gian bin son. N l mt cch d
dng s dng chung cc tp hp v bn khng c th thc hin cc hot ng
c phn loi.
2. I Enumerable (T) l giao din cho php tp hp cc lp lit k bng cch s
dng cu lnh foreach. Tp hp chung cc lp h tr I Enumerable (T) cng ging
nh tp hp cc lp khng chung chng hn nh I Enumerable h tr ArrayList.
V.1 IEnumerable cc bin trong cc cu truy vn LINQ
Cc bin trong cu truy vn LINQ c kiu nh I Enumerable (T) hoc c kiu bt
ngun t mt ngun nh I Queryable (T). Khi bn xem mt cu truy vn c bin l kiu
I Enumerable<Customer>, n n gin l cc thc truy vn, khi n c thc hin, s
to ra mt trnh t khng c g hoc nhiu i tng Customer.
IEnumerable<Customer> customerQuery =from cust in customers
where cust.City == "London" select cust;
foreach (Customer customer in customerQuery)
{
Console.WriteLine(customer.LastName + ", " + customer.FirstName);
}
V.2 Cho php chng trnh bin dch x l cc loi khai bo chung
Nu bn thch, bn c th trnh c php chung chung bng cch s dng t kha
var. Cc t kha var hng dn trnh bin dch nhn ra loi bin mt truy vn tm
kim ti cc ngun d liu c xc nh trong mnh from. V d sau cho cng mt
kt qu nh on m c xy dng pha trn.
var customerQuery2 =
from cust in customers
where cust.City == "London"
select cust;

n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 16

foreach(var customer in customerQuery2)
{
Console.WriteLine(customer.LastName + ", " + customer.FirstName);
}
Cc t kha var rt hu ch khi cc loi ca bin l r rng hoc khi n khng
phi l iu quan trng xc nh r rng cc loi chung nh l ci c to ra bng
cch nhm cc truy vn. Ni chung, chng ti ngh rng nu bn s dng var, nhn
thy rng n c th lm cho m ca bn kh khn hn cho nhng ngi khc c.
V.3 Hot ng truy vn c bn.
Ch ny cho mt gii thiu tm tt v truy vn LINQ v mt s biu hin ca
cc loi hnh hot ng in hnh m bn thc hin trong mt truy vn.
Ch : Nu bn l quen thuc vi mt truy vn ngn ng nh SQL hay XQuery, bn
c th b qua hu ht cc ch ny. c v "mnh from" trong phn k tip tm
hiu v trt t ca cc mnh trong biu thc truy vn LINQ.
V.3.1 Obtaining a Data Source
Ly vt l mt ngun d liu
Trong mt truy vn LINQ, bc u tin l xc nh ngun d liu. Trong C #
cng nh trong hu ht cc ngn ng lp trnh mt bin phi c khai bo trc khi n
c th c s dng. Trong mt truy vn LINQ, mnh from ng u tin gii
thiu cc ngun d liu (customer) v nhiu bin (cust).
//queryAllCustomers is an IEnumerable<Customer>
var queryAllCustomers = from cust in customers
select cust;
Phm vi bin ging nh cc bin lp trong mt vng lp foreach, ngoi tr khng c thc
s mt vng lp xy ra trong mt biu thc truy vn. Khi truy vn c thi hnh, trong
phm vi bin s phc v nh l mt tham chiu ln lt n cc cc phn t trong mi
customers. Bi v trnh bin dch c th nhn ra cc kiu khc nhau ca cuts, bn khng
th xc nh n r rng. B sung phm vi cc bin c th c gii thiu bi mt mnh
let.
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 17

V.3.2 Filtering( Lc)
C l cc hnh ng truy vn ph bin nht l mt b lc p dng trong cc
mu ca mt biu thc logic Boolean. Cc b lc gip cc truy vn tr v duy nht cc
phn t cho cc biu thc l ng. Kt qu l kt qu c s dng mnh where. Cc
b lc c hiu lc xc nh cc yu t loi tr t cc ngun lin tc. Trong v d
sau, ch nhng khch hng c a ch London s c tr v.
var queryLondonCustomers = from cust in customers
where cust.City == "London"
select cust;
Bn c th s dng quen ngn ng C# vi cc biu thc logic AND v OR vn
hnh p dng nh nhiu b lc trong mnh where. V d, ch tr v cc khch hng c
a ch ti"London" v c tn l "Devon" bn s vit on m sau y:
where cust.City=="London" && cust.Name == "Devon"
tr v khch hng c a ch London hay Paris, bn s vit m sau:
where cust.City == "London" || cust.City == "Paris"
V.3.3 Ordering (Th t)
Thng n l thun tin phn loi d liu tr v. Mnh orderby s gy ra
cc phn t trong chui tr v c sp xp theo mc nh so snh cho cc loi ang
c sp xp. V d, sau y truy vn c th c m rng phn loi cc kt qu da
trn thuc tnh Name. Bi v thuc tnh Name l mt chui, mc nh n s so snh v
thc hin sp xp theo th t ch ci t A n Z.
var queryLondonCustomers3 =
from cust in customers
where cust.City == "London"
orderby cust.Name ascending
select cust;
cc kt qu trong th t o ngc trt t, t A to Z, s dng mnh
orderby ...descending.
V.3.4 Grouping
Mnh group cho php bn nhm cc kt qu ca bn da trn mt kha m bn
ch nh. V d, bn c th xc nh rng cc kt qu cn c nhm li theo thuc tnh
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 18

City tt c cc khch hng t London, Paris hay c nhn ang c trong nhm. Trong
trng hp ny, cust.City chnh l kha.
Ch : Cc kiu r rng ang c trong cc v d minh ha cc khi nim. Bn cng c
th s dng chnh cho custQuery, group,cad customer cho trnh bin dch xc nh
chnh xc loi.
// queryCustomersByCity is an IEnumerable<IGrouping<string, Customer>>
var queryCustomersByCity =
from cust in customers
group cust by cust.City;

// customerGroup is an IGrouping<string, Customer>
foreach (var customerGroup in queryCustomersByCity)
{
Console.WriteLine(customerGroup.Key);
foreach (Customer customer in customerGroup)
{
Console.WriteLine(" {0}", customer.Name);
}
}
Khi bn kt thc mt truy vn vi mnh group, cc kt qu ca bn s s c
tr v mt danh sch t cc danh sch. Mi phn t trong danh sch l mt i tng c
mt Key thnh vin v danh sch cc phn t l nhm cha kha ny. Khi bn lp qua
mt truy vn m kt qu l mt nhm c trnh t, bn cn phi s dng mt vng lp
foreach. Nu bn cn phi tham kho cc kt qu thi hnh ca mt nhm, bn c th s
dng t kha into to ra mt nh danh c th c thm vo cu truy vn. Di y
l nhng truy vn tr li ch nhng nhm c cha nhiu hn hai khch hng:
var custQuery =
from cust in customers
group cust by cust.City into custGroup
where custGroup.Count() > 2
orderby custGroup.Key
select custGroup;
V.3.5 Joining
Thao tc Join to ra s kt hp gia nhiu s kin khng c r rng m trong
ngun d liu. V d, bn c th thc hin mt thao tc tm tt c cc khch hng
London nhng ngi t hng cc sn phm t nh cung cp, h ang Paris. Trong
LINQ mnh Join lun lun tham gia cc hot ng da trn tp i tng thay v cc
bng c s d liu. Trong LINQ bn khng s dng mnh Join thng xuyn nh
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 19

bn lm trong SQL bi v cc kha ngoi LINQ miu t trong m hnh nh l thuc tnh
nm gi mt tp cc mc. V d, mt i tng Customer c cha mt tp Order ca
cc i tng. ng hn l biu din mt thao tc, bn truy cp cc th t bng cch s
dng du chm:
from order in Customer.Orders...
V.3.6 Selecting (Projections)
Mnh Select a ra cc kt qu tr v ca mt cu truy vn v xc nh "hnh
dng" hoc kiu ca mi kt qu tr v. V d, bn c th ch nh cho d kt qu ca bn
s bao gm tt c cc i tng Customer, ch cn mt thnh vin, mt nhm ca cc
thnh vin, hoc mt s kt qu loi hon ton khc nhau da trn tnh ton hay mt i
tng mi to ra. Khi mnh Select a ra mt ci g khc l mt bn sao ca cc
phn t ngun, thao tc c gi l bn d tho. Vic s dng cc bn d tho chuyn
i d liu l mt kh nng ca biu thc truy vn LINQ.
V.4 Chuyn i d liu vi LINQ
Ngn ng-Integrated Query (LINQ) khng phi l ch c truy li d liu. N cng
l mt cng c mnh m cho vic chuyn d liu. Bng cch s dng mt truy vn
LINQ, bn c th s dng mt chui ngun d liu vo v sa i n trong nhiu cch
to ra mt chui ra mi. Bn c th sa i trnh t bn thn n m khng sa i cc
phn t bng cch phn loi v gom nhm. Nhng c l trong hu ht cc tnh nng mnh
m ca cc cu truy vn LINQ l kh nng to loi mi. y l hon ho trong mnh
select. V d, bn c th thc hin cc nhim v sau:
Hp nht nhiu dy u vo thnh mt dy u ra n l c mt loi mi.
To ra dy cc phn t bao gm ch mt hoc mt vi thuc tnh ca mi phn t.
To ra dy cc phn t bao gm cc kt qu ca s thi hnh trn cc ngun d
liu.
To ra dy trong mt nh dng khc nhau. V d, bn c th chuyn i nhng
hng d liu t SQL hoc vn bn vo file XML.
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 20

y ch l mt vi v d. Tt nhin, nhng s chuyn i c th c kt hp theo
cch khc nhau trong cng mt truy vn. Hn na, trnh t ra ca mt chui truy vn ny
c th c s dng nh l yu t u vo cho mt chui truy vn mi.
V.4.1 Tham gia vo nhiu yu t u vo xut ra mt trnh t.
Bn c th s dng mt truy vn LINQ to ra mt trnh t u ra c cha cc
phn t t nhiu hn mt trnh t u vo. V d sau cho thy lm th no kt hp hai
cu trc d liu trong b nh, nhng cng mt nguyn tc c th c p dng kt
hp cc ngun d liu t XML hoc SQL hoc DataSet. V d sau cho thy iu :
class Student
{
public string First { get; set; }
public string Last {get; set;}
public int ID { get; set; }
public string Street { get; set; }
public string City { get; set; }
public List<int> Scores;
}

class Teacher
{
public string First { get; set; }
public string Last { get; set; }
public int ID { get; set; }
public string City { get; set; }
}
V d sau cho thy mt cu truy vn:
class DataTransformations
{
static void Main()
{
// Create the first data source.
List<Student> students = new List<Student>()
{
new Student {First="Svetlana",
Last="Omelchenko",
ID=111,
Street="123 Main Street",
City="Seattle",
Scores= new List<int> {97, 92, 81, 60}},
new Student {First="Claire",
Last="ODonnell",
ID=112,
Street="124 Main Street",
City="Redmond",
Scores= new List<int> {75, 84, 91, 39}},
new Student {First="Sven",
Last="Mortensen",
ID=113,
Street="125 Main Street",
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 21

City="Lake City",
Scores= new List<int> {88, 94, 65, 91}},
};

// Create the second data source.
List<Teacher> teachers = new List<Teacher>()
{
new Teacher {First="Ann", Last="Beebe", ID=945, City = "Seattle"},
new Teacher {First="Alex", Last="Robinson", ID=956, City = "Redmond"},
new Teacher {First="Michiyo", Last="Sato", ID=972, City = "Tacoma"}
};

// Create the query.
var peopleInSeattle = (from student in students
where student.City == "Seattle"
select student.Last)
.Concat(from teacher in teachers
where teacher.City == "Seattle"
select teacher.Last);

Console.WriteLine("The following students and teachers live in Seattle:");
// Execute the query.
foreach (var person in peopleInSeattle)
{
Console.WriteLine(person);
}

Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
/* Output:
The following students and teachers live in Seattle:
Omelchenko
Beebe
*/
V.4.2 La chn mt tp hp con ca mi phn t ngun
C hai cch chnh la chn mt nhm ca mi phn t trong chui ngun:
1. chn ch cn mt thnh vin ca cc phn t ngun nguyn t, s dng thao
tc chm. Trong v d sau, gi nh rng mt i tng Customer c cha mt s
thuc tnh public bao gm mt chui c tn City. Khi thc hin, truy vn ny s cho
ra mt trnh t cc chui u ra.
var query = from cust in Customers select cust.City;
3. to cc phn t c cha nhiu hn mt thuc tnh cc phn t ngun, bn c th
s dng mt i tng vi mt i tng c tn hoc mt loi v danh. V d sau
cho thy vic s dng mt n danh ng gi hai loi thuc tnh t mi phn t
Customer:
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 22

var query = from cust in Customer
select new {Name = cust.Name, City = cust.City};
V.4.3 Chuyn i cc i tng trong b nh vo XML
Cc cu truy vn LINQ lm cho n d dng chuyn ha d liu gia cu trc d
liu trong b nh, c s d liu SQL, ADO.NET Datasets v lung XML, hoc cc ti
liu. V d sau cho thy vic chuyn i d liu trong b nh vo cc phn t trong
XML:
class XMLTransform
{
static void Main()
{
// Create the data source by using a collection initializer.
List<Student> students = new List<Student>()
{
new Student {First="Svetlana", Last="Omelchenko", ID=111, Scores = new
List<int>{97, 92, 81, 60}},
new Student {First="Claire", Last="ODonnell", ID=112, Scores = new
List<int>{75, 84, 91, 39}},
new Student {First="Sven", Last="Mortensen", ID=113, Scores = new
List<int>{88, 94, 65, 91}},
};

// Create the query.
var studentsToXML = new XElement("Root",
from student in students
let x = String.Format("{0},{1},{2},{3}", student.Scores[0],
student.Scores[1], student.Scores[2], student.Scores[3])
select new XElement("student",
new XElement("First", student.First),
new XElement("Last", student.Last),
new XElement("Scores", x)
) // end "student"
); // end "Root"

// Execute the query.
Console.WriteLine(studentsToXML);

// Keep the console open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
Ta c kt qu l:
< Root>
<student>
<First>Svetlana</First>
<Last>Omelchenko</Last>
<Scores>97,92,81,60</Scores>
</student>
<student>
<First>Claire</First>
<Last>O'Donnell</Last>
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 23

<Scores>75,84,91,39</Scores>
</student>
<student>
<First>Sven</First>
<Last>Mortensen</Last>
<Scores>88,94,65,91</Scores>
</student>
</Root>
V.4.4 Thc hin cc hot ng trn cc phn t ngun.
Mt trnh t u ra c th khng cha bt k nhng phn t hoc thuc tnh ca phn t
t trnh t ngun. u ra phi cthay th c bi chui cc gi tr c tnh bng
cch s dng cc phn t ngun nh i s u vo. Di y l nhng truy vn n
gin, khi n c thc hin, kt qu u ra ca mt trnh t nhng chui c gi tr i
din cho mt tnh ton da trn cc ngun trnh t cc phn t thuc kiu double.
Ch : Vic gi cc phng thc trong cc biu thc truy vn khng c h tr nu
truy vn s c dch sang mt tn min khc. V d, bn khng th gi phng thc C #
thng thng trong LINQ to SQL v SQL Server khng c ng cnh cho n. Tuy nhin,
bn c th nh x thnh cc th tc trong SQL v gi cc phng thc .
class FormatQuery
{
static void Main()
{
// Data source.
double[] radii = { 1, 2, 3 };

// Query.
IEnumerable<string> query =
from rad in radii
select String.Format("Area = {0}", (rad * rad) * 3.14);

// Query execution.
foreach (string s in query)
Console.WriteLine(s);

// Keep the console open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
/* Output:
Area = 3.14
Area = 12.56
Area = 28.26
*/
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 24

V.4.5 Loi cc quan h trong thao tc truy vn.
vit truy vn c hiu qu, bn nn hiu loi ca cc bin trong mt truy vn
nh th no hon tt tt c cc thao tc lin quan n nhau. Nu bn hiu c nhng
mi quan h, bn s d dng hn lnh hi cc v d LINQ v on code v d trong ti
liu hng dn. Hn na, bn s hiu nhng g xy ra ng sau nhng hin trng khi
cc bin c hon ton phn loi cch s dng t kha var.
Thao tc truy vn LINQ c phn loi r rng trong ngun d liu, trong chnh
cu truy vn, v trong thc thi truy vn. Cc loi ca cc bin trong truy vn phi tng
thch vi cc phn t trong d liu ngun v vi cc loi ca bin lp trong cu lnh
foreach. iu ny m bo rng cc loi li u b bt li ti thi im bin dch khi
ngi ta c th sa li trc khi n c a vo lm ng dng.
gii thch cc loi cc mi quan h, hu ht cc v d m lm c s dng
kiu r rng cho tt c cc bin. Cui cng v d cho thy nh th no cng p dng mt
nguyn tc ngay c khi bn s dng t kha var.
V.5.6 Truy vn m khng chuyn ha cc ngun d liu
Th d minh ha sau y cho thy mt cu truy vn LINQ ti cc i tng
hot ng m khng thc hin chuyn i trn d liu. Ngun cha mt trnh t ca
nhng chui v gi tr u ra l mt trnh t cc chui.

1. Cc loi i s ca cc ngun d liu xc nh r loi min ca bin.
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 25

2. Cu lnh select s tr v thuc tnh Name thay v hon thnh i tng Customer. Bi
v Name v l mt chui, cc kiu i s ca custNameQuery l chui, khng phi
Customer.
3. Bi v custNameQuery l mt trnh t cc chui, bin ca vng lp foreach cng phi
l mt chui.
Th d sau y cho thy mt s chuyn i hi phc tp hn. Cu lnh select tr v mt
kiu nc danh loi m ch cn lu gi c hai thnh vin ca cc i tng Customer
gc.


V.5.7 Trnh bin dch phi suy lun ra cc loi thng tin
Mc d bn nn tm hiu nhng loi cc mi quan h trong mt hot ng truy vn, bn
khng c tu chn cho php trnh bin dch lm tt c cc cng vic cho bn. Cc t
kha var c th c s dng cho bt k bin cc b no trong mt thao tc truy vn.
ng. Th d sau y l v d chnh xc tng ng vi v d s 2 c tho lun
pha trn. S khc nhau duy nht l trnh bin dch s c cung cp kiu r rng cho mi
bin trong hot ng truy vn:
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 26


V.6 C php truy vn vs c php phng thc.
Ni chung, chng ti khuyn bn nn s dng c php truy vn v n thng l
n gin hn v hay hn; tuy nhin y khng c s khc bit gia c php truy vn v
c php phng th. Ngoi ra, mt s truy vn, chng hn nh vic truy lc cc phn t
ph hp vi mt iu kin xc nh, hu ht cc truy vn trong LINQ gii thiu trong ti
liu hng dn c vit thnh vn bn l biu thc truy vn bng cch s dng c php
truy vn c tnh tuyn b c gii thiu trong C # 3.0. Tuy nhin,.NET runtime ngn
ng chung(CRL_Common Language Runtime) khng c nim ca c php truy vn
trong chnh n. V vy, ti thi im bin dch, biu thc truy vn l thng dch g m
CRL, khng hiu: gi cc phng thc. Cc phng thc ny c gi l ton t truy
vn chun, v chng c cc tn nh Where, Select, GroupBy, Join, Max, Average v
nh vy trn. Bn c th gi chng trc tip bng cch s dng c php phng thc cc
c php truy vn. Truy lc cc phn t c gi tr ti a trong mt m ngun trnh t, ch
c th c th hin nh cc ln gi phng thc. Cc ti liu tham kho cho biu thc
truy vn chun trong namespace System.Linq bi hu ht mi ngi s dng c php
phng thc. V vy, ngay c khi bt u vit truy vn LINQ, n rt hu ch lm quen
vi cch s dng c php phng thc trong truy vn v ton t thc truy vn.
V.6.1 Ton t truy vn chun m rng cc phng thc
V d sau cho thy mt cch d dng biu thc truy vn v cc ng ngha tng ng
truy vn c vit nh l mt phng thc da trn truy vn.
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 27

class QueryVMethodSyntax
{
static void Main()
{
int[] numbers = { 5, 10, 8, 3, 6, 12};

//Query syntax:
IEnumerable<int> numQuery1 =
from num in numbers
where num % 2 == 0
orderby num
select num;

//Method syntax:
IEnumerable<int> numQuery2 = numbers.Where(num => num % 2 == 0).OrderBy(n =>
n);

foreach (int i in numQuery1)
{
Console.Write(i + " ");
}
Console.WriteLine(System.Environment.NewLine);
foreach (int i in numQuery2)
{
Console.Write(i + " ");
}

// Keep the console open in debug mode.
Console.WriteLine(System.Environment.NewLine);
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
}
/*
Output:
6 8 10 12
6 8 10 12
*/
u ta t hai v d l ging ht nhau. Bn c th thy rng cc loi ca bin truy
vn bin l cng mt trong hai hnh thc: IEnumerable (T).
tm hiu phng thc da trn cu truy vn, hy kim tra n cht ch hn.
bn phi ca biu thc, ch rng ch rng mnh where gi y khng cn c
th hin nh l mt phng thc d trn i tng numbers, m l bn s gi li mt loi
kiu IEnumerable<int> . Nu bn l quen thuc vi giao din IEnumerable (T), bn bit
rng n khng c mt phng thc where. Tuy nhin, nu bn gi trnh h tr thng
minh hon thnh danh sch trong Visual Studio IDE, bn s thy khng ch l mt
phng thc where, nhng nhiu phng thc khc nh: select, SelectMany, Join, v
Orderby. y l tt c cc ton t truy vn chun.
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 28


Mc d n c v nh nu giao din IEnumerable (T) c nh ngha li b
xung cc phng thc ny, trn thc t ci ny khng phi l cch. Cc ton t truy vn
chun c thc hin nh l mt loi phng thc mi c gi l cc phng thc m
rng. Cc phng thc m rng " extend " mt loi hin c; chng c th c gi l nu
chng c th hin cc phng thc da trn kiu. Ton t truy vn chun m rng
interface IEnumerable (T) v l l do ti sao, bn c th vit numbers.Where (...).
bt u s dng LINQ, bn phi chc chn rng bn thc s hiu tt c v cc
phng thc m rng l lm th no em chng vo trong phm vi ng dng ca bn
bng cch s dng ng hng dn. iu ny c gii thch thm trong phn lm th
no : To mt d n LINQ.
V.6.2 Biu thc Lambda
Trong v d trc, ch rng cc biu thc iu kin (num% 2 ==0) l thng qua
nh l mt trong nhng i s ca phng thc where: Where (num => num% 2 == 0).
Biu thc trong ngoc c c gi l biu thc lambda. l mt phng thc nc
danh c th cha ng nhng biu thc v cc pht biu v c th s dng to mt y
nhim chung hoc mt biu thc cy. Trong C # => l ton t lambda, c c nh
"goes to". Cc num bn tri ca cc ton t l yu t u vo bin tng ng vi num
trong biu thc truy vn. Trnh bin dch c th nhn kiu num bi v n bit rng
numbers l mt kiu chung I Enumerable (T). Ton t lambda ch ging nh cc biu
thc trong c php truy vn hay trong biu thc C # hoc cu lnh; n c th bao gm c
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 29

cc ln gi phng thc v cc phng thc logic phc tp. The "tr v gi tr" ch l cc
biu thc kt qu.
bt u s dng LINQ, bn khng s dng lambdas nhiu. Tuy nhin, mt s
truy vn ch c th c th hin trong c php phng thc v mt s yu cu ca
nhng biu thc lambda. Sau khi bn tr nn quen thuc vi lambdas, bn s thy rng
n l mt cng c mnh m v linh hot trong LINQ ca bn.
Trong don m v d trc, khng phi phng thc OrderBy l dn chng bng
cch s dng du chm gi ti where. Where a ra trnh t lc, v sau Orderby
c tc dng sp xp trnh t . Bi v cc truy vn tr tr v mt IEnumerable, bn
son chng trong c php phng thc xch cc ln gi phng thc li vi nhau. y l
nhng g trnh bin dch lm dng sau hin trng khi bn vit truy vn bng cch s
dng c php truy vn. V bi v mt truy vn bin khng lu tr cc kt qu ca cu
truy vn, bn c th thay i n hay s dng n nh l c s cho mt truy vn mi bt k
lc no, ngay c sau khi n c thc hin.
V.7 Cc c trng c LINQ h tr trong C#3.0
Di y l nhng phn gii thiu nhng ngn ng mi xy dng trong C # 3.0.
Mc d cc tnh nng mi tt c u c s dng n mt mc vi cc truy vn
LINQ, chng khng gii hn i vi LINQ v c th c s dng trong bi cnh bt c
ni bn tm thy chng hu ch.
V.7.1 Biu thc truy vn.
Biu thc truy vn s dng c pho khai bo tng t vi SQL hay XQuery
truy vn trn tp hp I Enumerable. Ti thi im bin dch c php truy vn l phng
thc gi n mt nh cung cp LINQ ca vic trin khai thc hin ca ton t truy vn
chun cc phng thc m rng. ng dng kim sot cc ton t biu thc truy vn
chun trong namespace thch hp vi mt ch dn using. Di y l mt biu thc truy
vn chun lm cho mt mng cc chui, nhm chng theo k t u tin trong chui, v
phn loi chng thnh mt nhm.
var query = from str in stringArray
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 30

group str by str[0] into stringGroup
orderby stringGroup.Key
select stringGroup;
V.7.2 Implicitly Typed Variables (var)
Thay v xc nh r rng mt loi khi bn khai bo v khi to mt bin, bn c th s
dng t kha var ch th cho trnh bin dch nhn ra v gn kiu, nh c hin th
y:
var number = 5;
var name = "Virginia";
var query = from str in stringArray
where str[0] == 'm'
select str;
Cc bin c khai bo l var l ch cn kiu r rng nh cc bin c loi bn ch
nh r rng. Vic s dng cc var lm cho n c th to ra loi v danh, nhng n c th
c s dng cho bt k bin cc b no.
V.7.3 i tng, v tp hp cc gi tr u vo
i tng, v tp hp cc gi tr u vo lm cho n c th khi to cc i tng
m khng r rng gi mt constructor cho i tng. Cc gi tr u vo thng c s
dng trong truy vn khi chng biu hin cho ngun d liu ca d n vo mt kiu d
liu mi. Gi nh rng mt lp c tn l Customer vi hai thuc tnh Name v Phone
c khai bo vi t kha public, cc i tng gi tr u vo c th c s dng nh
trong cc m sau y:
Customer cust = new Customer {Name = "Mike" ; Phone ={ "555-1212 "};
V.7.4 Cc loi cha xc nh
Kiu n danh l mt kiu xy dng bi trnh bin dch v loi tn l bin duy nht cho
trnh bin dch. Cc loi cha xc nh cung cp mt s tin li thit lp mt hp
nhm cc thuc tnh tm thi trong mt kt qu truy vn m khng c xc nh mt
loi tn ring. Cc loi cha xc nh c khi ng vi mt biu thc mi v mt i
tng gi tr u vo, nh c hin th y:
select new {name = cust.Name, phone = cust.Phone};
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 31

V.7.5 Cc phng thc m rng
Cc phng thc m rng l mt phng thc tnh c th c kt hp vi mt loi,
n c th c gi nh mt loi th hin ca phng thc. Tnh nng ny cho php bn,
c th, "add" them mt phng thc c sn m bn khng phi chnh sa n. Cc ton t
truy vn chun l mt tp cc phng thc m rng cung cp LINQ tnh nng truy vn
cho bt k kiu no thc thi interface IEnumerable (T).
V.7.6 Cc thuc tnh t ng thi hnh
Cc tnh t ng thi hnh lm cho vic khai bo thuc tnh ngn gn hn. Khi bn khai
bo mt thuc tnh nh c hin th trong v d sau, trnh bin dch s to ra mt trng
n khng cho php truy cp, ngoi tr thng qua cc thuc tnh get v set.
public string Name {get; set;}
V.8 Vit cu truy vn trong C#
Phn ny s hng dn bn thng qua vic s dng cc tnh nng mi ca C# 3.0 v
hin th chng nh th no vit biu thc truy vn LINQ. Sau khi hon tt phn ny
bn s sn sng chuyn sang cc v d mu v ti liu hng dn c th cho cc ch
m LINQ cung cp, chng hn nh LINQ to SQL, LINQ to Datasets, hoc LINQ to
XML.
Cc ngun d liu cho cc truy vn n gin l mt danh sch cc i tng Student.
Mi mu tin Student c cc thuc tnh l firstName v lastname, v mt mng cc s
nguyn i din cho im kim tra trong mt lp. Sao chp on m ny vo d n ca
bn.
V.8.1 thm cc d liu ngun
Thm vo lp Student v khi to danh sch sinh vin ti lp Program trong d
n ca bn.
public class Student
{
public string First { get; set; }
public string Last { get; set; }
public int ID { get; set; }
public List<int> Scores;
}

n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 32

// Create a data source by using a collection initializer.
static List<Student> students = new List<Student>
{
new Student {First="Svetlana", Last="Omelchenko", ID=111, Scores= new List<int>
{97, 92, 81, 60}},
new Student {First="Claire", Last="ODonnell", ID=112, Scores= new List<int> {75,
84, 91, 39}},
new Student {First="Sven", Last="Mortensen", ID=113, Scores= new List<int> {88, 94,
65, 91}},
new Student {First="Cesar", Last="Garcia", ID=114, Scores= new List<int> {97, 89,
85, 82}},
new Student {First="Debra", Last="Garcia", ID=115, Scores= new List<int> {35, 72,
91, 70}},
new Student {First="Fadi", Last="Fakhouri", ID=116, Scores= new List<int> {99, 86,
90, 94}},
new Student {First="Hanying", Last="Feng", ID=117, Scores= new List<int> {93, 92,
80, 87}},
new Student {First="Hugo", Last="Garcia", ID=118, Scores= new List<int> {92, 90,
83, 78}},
new Student {First="Lance", Last="Tucker", ID=119, Scores= new List<int> {68, 79,
88, 92}},
new Student {First="Terry", Last="Adams", ID=120, Scores= new List<int> {99, 82,
81, 79}},
new Student {First="Eugene", Last="Zabokritski", ID=121, Scores= new List<int> {96,
85, 91, 60}},
new Student {First="Michael", Last="Tucker", ID=122, Scores= new List<int> {94, 92,
91, 91} }
};
Thm mt Student mi vo danh sch Students v s dng mt tn v im kim
tra cho la chon ca bn. Hy th g tt c cc thng tin sinh vin mi tm hiu cc c
php tt hn cho cc i tng.
V.9 To cc truy vn
V.9.1 to mt truy vn n gin
Trong phng thc Main ca ng dng, to mt truy vn n gin, khi n c thc
hin, s xut ra mt danh sch ca tt c cc sinh vin c im du tin trong mng im
kim tra trn 90. Lu rng bi v ton b i tng Student c chn, cc kiu truy
vn l I Enumerable<Student>. Mc d on m cng c th s dng ng kiu bng
cch s dng t kha var, kiu r rng c s dng minh ha r rng kt qu. Cng
lu rng cc truy vn nhiu bin, student, phc v nh mt tham chiu cho mi
Studnet trong cc ngun, cung cp cho cc thnh vin truy cp mi i tng.
// Create the query.
// studentQuery is an IEnumerable<Student>
var studentQuery =
from student in students
where student.Scores[0] > 90
select student;
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 33

V.9.2 thc hin cc truy vn
1. By gi vit vng lp foreach s thc hin truy vn. Lu sau y v cc m:
Mi phn t trong chui c tr v l c truy cp thng qua cc bin lp trong
vng lp foreach.
Cc kiu bin ny l student, v cc kiu bin truy vn bin l tng thch,
IEnumerable<Student>.
2. Sau khi bn c thm vo m ny, xy dng v chy cc ng dng bng cch nhn
Ctrl + F5 xem cc kt qu trong ca s Console.
// Execute the query.
// var could be used here also.
foreach (Student student in studentQuery)
{
Console.WriteLine("{0}, {1}", student.Last, student.First);
}
V.9.3 thm mt iu kin lc
Bn c th kt hp nhiu iu kin logic trong mnh where tinh chnh thm
mt truy vn. on m sau y cho bit thm mt iu kin , truy vn tr v nhng
sinh vin c im s u tin trn 90 v c im cui cng t hn 80.
where student.Scores[0] > 90 && student.Scores[3] < 80
V.9.4 Chnh sa truy vn
N s c d dng hn qut cc kt qu nu chng c trong mt s nhm c
c tnh ging nhau. Bn c th sp xp theo trnh t cc kt qu c tr v bng
cch s dng bt k thuc tnh no trong cc phn t ngun. V d, sau y mnh
orderby sp xp cc kt qu tr v theo trt t t A ti Z theo tn ca mi sinh vin.
Thm vo mnh sau y orderby vo cu truy vn ca bn, ngay sau cu lnh where
v trc cu lnh select:
orderby student.Last ascending
By gi thay i mnh orderby n sp xp cc kt qu tr v tng dn ca
im s du tin trong mng im kim tra cu mi sinh vin.
orderby student.Scores[0] descending
Bn thay i nh dng chui c xut ra mn hnh d xem kt qu:
Console.WriteLine("{0}, {1} {2}", s.Last, s.First, s.Scores[0]);
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 34

V.9.5 nhm cc kt qu
Nhm l mt kh nng mnh m c th lm c trong biu thc truy vn. Mt
truy vn vi mt nhm mnh dn n vic nhm chng theo trnh t, v mi nhm
cha mt kha v mt trnh t bao gm tt c cc thnh vin ca nhm . Sau y l
mt truy vn mi nhm cc hc sinh bng cch s dng cc ch ci u tin trong tn
ca h lm kho.
// studentQuery2 is an IEnumerable<IGrouping<char, Student>>
var studentQuery2 =
from student in students
group student by student.Last[0];
V.9.6 To order the groups by their key value
Khi bn chy cc truy vn trc , bn thng bo rng cc nhm khng theo th t ch
ci. thay i n, bn phi cung cp mt mnh orderby sau mnh group. Nhng
s dng mnh orderby, trc tin bn cn phi c nh danh l phc v nh mt
tham chiu n cc nhm c to ra bi mnh group. Bn cung cp cc nh danh
bng cch s dng t kha into, nh sau:
var studentQuery4 =
from student in students
group student by student.Last[0] into studentGroup
orderby studentGroup.Key
select studentGroup;

foreach (var groupOfStudents in studentQuery4)
{
Console.WriteLine(groupOfStudents.Key);
foreach (var student in groupOfStudents)
{
Console.WriteLine(" {0}, {1}",
student.Last, student.First);
}
}
Khi bn chy truy vn ny, bn s thy cc nhm v ang c sp xp theo th t ch
ci.
V.9.7 gii thiu mt nh danh bng cch s dng let
Bn c th s dng t kha let gii thiu cho mt nh danh cho bt k biu
thc tr v trong biu thc truy vn.nh danh ny c th l mt s tin nghi, nh trong
v d sau y, hoc n c th nng cao hiu qu s thc thi bng cch lu tr cc kt qu
ca mt biu thc n khng phi c tnh ton nhiu ln.
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 35


var studentQuery5 =
from student in students
let totalScore = student.Scores[0] + student.Scores[1] +
student.Scores[2] + student.Scores[3]
where totalScore / 4 < student.Scores[0]
select student.Last + " " + student.First;

foreach (string s in studentQuery5)
{
Console.WriteLine(s);
}
V.9.8 s dng c php phng thc trong mt biu thc truy vn
Nh nu trong C php truy vn v c php phng (LINQ), mt s hot ng
truy vn ch c th c th hin bng cch s dng c php phng thc. Di y l
on m tnh ton tng s im cho mi sinh vin trong trnh t ngun, v sau gi
phng thc Average () trn kt qu ca cu truy vn tnh ton cc im trung bnh
ca cc cc class. Lu cc v tr ca ngoc xung quanh biu thc truy vn.
var studentQuery6 =
from student in students
let totalScore = student.Scores[0] + student.Scores[1] +
student.Scores[2] + student.Scores[3]
select totalScore;

double averageScore = studentQuery6.Average();
Console.WriteLine("Class average score = {0}", averageScore);

V.9.9 chuyn i hoc d n trong mnh select
N rt ph bin cho mt truy vn to ra mt trnh t cc phn t khc nhau t cc
phn t trong cc trnh t ngun. Xa hay ghi ch cho truy vn trc ca bn v thc
hin vng lp, v thay th n vi on m sau y. Lu rng cc truy vn s tr v mt
trnh t ca cc chui, v thc t ny c phn nh trong vng lp foreach.
IEnumerable<string> studentQuery7 =
from student in students
where student.Last == "Garcia"
select student.First;
Console.WriteLine("The Garcias in the class are:");
foreach (string s in studentQuery7)
{
Console.WriteLine(s);
}
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 36

on m gii thiu lc u trong walkthrough ny ch ra rng im s trung bnh l
khong 334. to ra mt trnh t ca Students c tng im l cao hn mc trung bnh,
cng vi Student I D bn c th s dng mt loi v danh trong cu lnh select:
var studentQuery8 =
from student in students
let x = student.Scores[0] + student.Scores[1] +
student.Scores[2] + student.Scores[3]
where x > averageScore
select new { id = student.ID, score = x };

foreach (var item in studentQuery8)
{
Console.WriteLine("Student ID: {0}, Score: {1}", item.id, item.score);
}

VI. LINQ to SQL
LINQ cho SQL l mt thnh phn ca. NET Framework phin bn 3,5 m cung
cp mt thi gian chy-c s h tng qun l cc d liu nh cc i tng.
Ch : Cc d liu xut hin nh l mt b su tp ca hai chiu-bng (cc mi quan h
hoc tp tin phng), ni m cc ct bng lin quan n nhau. s dng LINQ cho SQL
mt cch c hiu qu, bn cn phi lm quen vi mt s khi nim c bn v c s d
liu quan h.
Trong LINQ cho SQL, m hnh d liu ca c s d liu quan h c nh x ti
m hnh i tng c m t trong ngn ng lp trnh ca cc chuyn vin pht trin
ng dng. Khi chy cc ng dng, vic chuyn i LINQ cho SQL vo SQL, cc truy
vn c tch hp ngn ng trong m hnh i tng v chuyn chng vo c s d liu
x l. Khi c s d liu s tr v kt qu, LINQ cho SQL chuyn chng tr li cc i
tng m bn ang lp trnh bng ngn ng lp trnh ca bn.
Cc chuyn vin pht trin ng dng s dng Visual Studio s dng cc chuyn vin
thit k hng i tng m c th cung cp giao din ngi dng thc thi nhiu tnh
nng ca LINQ cho SQL.
Ti liu hng dn i km trong bn pht hnh ny ca LINQ SQL m t cc
khi xy dng c bn, cc quy trnh, v k thut cn thit xy dng cc ng dng
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 37

LINQ cho SQL. Bn cng c th tm kim trn th vin MSDN cc vn tng t v
tham gia, ni bn c th tho lun mt cch chi tit cc ch ny vi cc chuyn gia.
Cui cng, cc truy vn tch hp ngn ng .Net
LINQ to SQL l mt phn ca cng ngh ADO.NET. N c da trn cc dch
v c cung cp bi m hnh nh cung cp ADO.NET. Do vy, bn c th pha trn m
LINQ to SQL vi cc ng dng ADO.NET sn c v chuyn cc gii php ADO.NET
cho LINQ to SQL. V d minh ha sau cung cp ci nhn cao hn v cc mi quan h

VI.1 Kt ni
Bn c th cung cp mt kt ni ADO.NET hin c khi bn to mt DataContext
cho LINQ to SQL. Tt c cc hot ng chng li cc DataContext (bao gm c cc truy
vn) s dng kt ni c cung cp. Nu kt ni m, LINQ to SQL cho php nh l
khi bn kt thc vi n.
string connString = @"Data
Source=.\SQLEXPRESS;AttachDbFilename=c:\northwind.mdf;
Integrated Security=True; Connect Timeout=30; User Instance=True";
SqlConnection nwindConn = new SqlConnection(connString);
nwindConn.Open();
Northwnd interop_db = new Northwnd(nwindConn);
SqlTransaction nwindTxn = nwindConn.BeginTransaction();
try
{
SqlCommand cmd = new SqlCommand(
"UPDATE Products SET QuantityPerUnit = 'single item' WHERE ProductID = 3");
cmd.Connection = nwindConn;
cmd.Transaction = nwindTxn;
cmd.ExecuteNonQuery();

interop_db.Transaction = nwindTxn;
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 38


Product prod1 = interop_db.Products
.First(p => p.ProductID == 4);
Product prod2 = interop_db.Products
.First(p => p.ProductID == 5);
prod1.UnitsInStock -= 3;
prod2.UnitsInStock -= 5;

interop_db.SubmitChanges();

nwindTxn.Commit();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
Console.WriteLine("Error submitting changes... all changes rolled back.");
}
nwindConn.Close();
Bn lun lun c th truy cp vo kt ni v ng n bng cch s dng cc c
tnh kt ni nh m sau y:
db.Connection.Close();
VI.2 Giao dch
Bn c th cung cp DataContext vi vic giao dch c s d liu khi cc ng
dng ca bt u giao dch v bn mun DataContext lin quan
Cc phng php giao dch thng dng vi .NET Framework l s dng
nhng i tngTransactionScope. Bng cch s dng phng php tip cn ny, bn c
th thc hin cc giao dch c phn phi trn c s d liu v qun l lu tr b nh
ca ngun. TransactionScope yu cu rt t ti nguyn khi ng. Chng thc y cc
phng php giao dch ch khi c nhiu kt ni trong phm vi giao dch.
using (TransactionScope ts = new TransactionScope())
{
db.SubmitChanges();
ts.Complete();
}

n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 39

Bn khng th s dng phng php tip cn ny cho tt c cc c s d liu. V
d, cc kt ni cho SqlClient khng th thc y systemTransactions h thng khi n
hot ng da trn mt my ch SQL Server 2000. Thay vo , n t ng vo mt
enlists y , phn b giao dch bt c khi no n thy mt phm vi giao dch ang c
s dng.
VI.3 Lnh SQL trc tip
i khi bn c th gp tnh hung m kh nng ca DataContext truy vn hoc
gi i cc thay i khng cho cc cng vic chuyn mn m bn mun thc hin.
Trong nhng trng hp , bn c th s dng cc phng php ExecuteQuery xut
ra cc lnh SQL cho c s d liu v chuyn i kt qu truy vn cho cc i tng.
V d, gi nh rng d liu ca cc khch hng tri ra trn hai bng (khch hng 1
v khch hng 2). Cc truy vn tr v sau y l mt kt qu ca i tng khch hang.
IEnumerable<Customer> results = db.ExecuteQuery<Customer>(
@"select c1.custid as CustomerID, c2.custName as ContactName
from customer1 as c1, customer2 as c2
where c1.custid = c2.custid"
);
Ch cn tn ct trong cc kt qu ni vi cc thuc tnh ct ca mt lp thc th
LINQ to SQL to ra cc i tng ra khi bt k truy vn SQL.
Cc tham s
Phng php ExecuteQuery chp nhn tham s. M sau y thc thi truy vn bng
tham s:
IEnumerable<Customer> results = db.ExecuteQuery<Customer>(
"select contactname from customers where city = {0}",
"London"
);
VI.4 Cch kt ni mt c s d liu (LINQ to SQL)
DataContext l ng dn chnh m bn kt ni vi mt c s d liu,sau bn
truy lc d liu t v gi tr li cc thay i. Bn ch cn s dng DataContext tng
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 40

t nh khi bn s dng mt ADO.NET SqlConnection. Trong thc t, cc DataContext
c khi ng vi mt kt ni hoc kt ni chui m bn cung cp.
Mc ch ca DataContext l dch cc yu cu cho cc i tng vo cc truy
vn ca SQL da trn cc c s d liu, v sau thu thp cc i tng ra khi cc
kt qu. DataContext cho php Language-Integrated Query (LINQ) bng cch thc thi
cc m hnh t chc cc ton t truy vn chun chng hn nh mnh Where v
Select.
V d
Trong v d sau, cc DataContext c s dng kt ni vi cc c s d liu
mu Northwind v truy lc li hng ca khch hng l ngi sng London.
// DataContext takes a connection string.
DataContext db = new DataContext(@"c:\Northwnd.mdf");
// Get a typed table to run queries.
Table<Customer> Customers = db.GetTable<Customer>();
// Query for customers from London.
var query =
from cust in Customers
where cust.City == "London"
select cust;
foreach (var cust in query)
Console.WriteLine("id = {0}, City = {1}", cust.CustomerID, cust.City);
Tt c cc bng c s d liu c trnh by trong bng bng phng php
GetTable s dng lp sn c nhn dng n.
Phng php thc hnh trnh by mt DataContext thay v da trn lp
DataContext c bn v phng php GetTable. Loi DataContext trnh by tp hp bng
nh mt thnh phn ca Context theo v d sau:.
public partial class Northwind : DataContext
{
public Table<Customer> Customers;
public Table<Order> Orders;
public Northwind(string connection) : base(connection) { }
}
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 41

Sau bn c th trnh by truy vn cho khch hng t London n gin hn
bng cch sau:
Northwnd db = new Northwnd(@"c:\Northwnd.mdf");
var query =
from cust in db.Customers
where cust.City == "London"
select cust;
foreach (var cust in query)
Console.WriteLine("id = {0}, City = {1}", cust.CustomerID, cust.City);
VI.5 Cch to c s d liu (LINQ to SQL)
Cc lp c cc thuc tnh c m t v cu trc ca bng v ct d liu lin
quan. Bn c th s dng thng tin ny to mi cc trng c s d liu. Khi bn gi
phng thc CreateDatabase trn DataContext, LINQ to SQL xy dng mt c s d
liu mi vi mt c cu xc nh bi cc i tng
Bn c th s dng tnh nng ny trong bt k kch bn no, c bit l khi c
bit n nh l mt nh cung cp dch v d liu v d nh SQL Server 2005 Express:
Bn ang xy dng mt ng dng t ng ci t trn mt h thng ca khc
hng.
Bn ang xy dng mtng dng dnh cho Client m cn lu c s d liu cc b
lu trong trng thi ngoi tuyn.
Ch : Thuc tnh d liu t m hnh i tng khng th m ha tt c cu trc ca c
s d liu hin c. Thuc tnh khng i din cho cc ni dung ca chc nng do ngi
dng quyt nh, cc th tc lu gi, triggers , kim tra cc rng buc d liu. Chc nng
CreateDatabase to ra mt bn sao ca c s d liu ch trong phm vi ca nhng thng
tin c m ho trong m hnh i tng. Hnh ng ny l cho mt lot cc c s d
liu.
Bn cng c th s dng CreateDatabase vi SQL Server bng cch s dng mt
tp tin .mdf hay ch l nh mc ty thuc vo chui kt ni. LINQ to SQL s dng
chui kt ni xc nh cc c s d liu c to ra v cch n c to trn my ch
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 42

V d: on m sau y cung cp mt v d v cch bn s to ra mt c s d
liu mi c tn MyDVDs.mdf.
public class MyDVDs : DataContext
{
public Table<DVD> DVDs;
public MyDVDs(string connection) : base(connection) { }
}

[Table(Name = "DVDTable")]
public class DVD
{
[Column(IsPrimaryKey = true)]
public string Title;
[Column]
public string Rating;
}
Bn c th s dng m hnh i tng to ra mt c s d liu nh sau
public void CreateDatabase()
{
MyDVDs db = new MyDVDs("c:\\mydvds.mdf");
db.CreateDatabase();
}
LINQ to SQL cng cung cp mt API th mt c s d liu hin c trc khi
to c s d liu mi mi. Bn c th chnh sa m trong kch bn 1 kim tra mt
phin bn hin c ca c s d liu. S dng DatabaseExists v DeleteDatabase phng
php thc hin phng thc tip cn ny. Sau khi bn gi CreateDatabase, cc c s
d liu mi tn ti v chp nhn cc truy vn v cc lnh .
Bn c th thc hin cc phng php tip cn ny bng cch s dng m nh sau:
public void CreateDatabase2()
{
MyDVDs db = new MyDVDs(@"c:\mydvds.mdf");
if (db.DatabaseExists())
{
Console.WriteLine("Deleting old database...");
db.DeleteDatabase();
}
db.CreateDatabase();
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 43

VI.6 Bn c th lm g vi LINQ to SQL
LINQ SQL h tr ti a cc kh nng quan trng p ng c mong mun
ca bn ging nh mt chuyn vin pht trin SQL. Bn c th truy vn cc thng tin,
chn, cp nht, v xa thng tin t bng.
VI.6.1 La chn(Select)
La chn l t c bng cch ch vit mt truy vn LINQ trong ngn ng lp
trnh ca bn v sau x l truy vn ly kt qu. LINQ to SQL t dch tt c cc hot
ng cn thit vo cc hot ng SQL cn thit m bn ang lm quen.
V d sau, cng ty, tn cng ty ca khch hng t London c truy lc v hin th
trong ca s console.
// Northwnd inherits from System.Data.Linq.DataContext.
Northwnd nw = new Northwnd(@"northwnd.mdf");

var companyNameQuery =
from cust in nw.Customers
where cust.City == "London"
select cust.CompanyName;

foreach (var customer in companyNameQuery)
{
Console.WriteLine(customer);
}
VI.6.2 Cch chn hng vo trong c s d liu (LINQ to SQL)
Bn chn hng vo mt c s d liu bng cch thm cc i tng vo bng
LINQ to SQL (TEntity) v sau gi cc thay i i ti c s d liu. LINQ cho SQL
dch vo nhng thay i ca bn thch hp lnh INSERT SQL thch hp. Cc bc sau
tm tt mt Di y l nhng bc gi nh rng mt hp l DataContext kt ni bn
vo c s d liu Northwind.

// Create a new Order object.
Order ord = new Order
{
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 44

OrderID = 12000,
ShipCity = "Seattle",
OrderDate = DateTime.Now
//
};
// Add the new object to the Orders collection.
db.Orders.InsertOnSubmit(ord);

// Submit the change to the database.
try
{
db.SubmitChanges();
}
catch (Exception e)
{
Console.WriteLine(e);
// Make some adjustments.
// ...
// Try again.
db.SubmitChanges();
}

VI.6.3 Chn mt hng vo c s d liu
1. To mi mt i tng trong bao gm cc d liu ct c gi n.
2. Thm vo cc i tng mi cho tp hp cc bng LINQ to SQL vi bng target
trong c s d liu.
3. Thay i gi i cc c s d liu.
Chn(Insert)
chn mt SQL, ch cn thm cc i tng vo m hnh i tng bn to,
v gi cc SubmitChanges trn DataContext. Trong v d sau, mt khch hng mi v
cc thng tin v cc khch hng s c thm vo bng Khch hng bng cch s dng
InsertOnSubmit.

// Northwnd inherits from System.Data.Linq.DataContext.
Northwnd nw = new Northwnd(@"northwnd.mdf");

n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 45

Customer cust = new Customer();
cust.CompanyName = "SomeCompany";
cust.City = "London";
cust.CustomerID = "98128";
cust.PostalCode = "55555";
cust.Phone = "555-555-5555";
nw.Customers.InsertOnSubmit(cust);

// At this point, the new Customer object is added in the object model.
// In LINQ to SQL, the change is not sent to the database until
// SubmitChanges is called.
nw.SubmitChanges();

VI.6.4 Cch cp nht hng trong c s d (LINQ to SQL)
Bn c th cp nht hng trong mt c s d liu bng cch thay i gi tr thnh
vin ca cc i tng kt hp vi bng LINQ to SQL (TEntity) v sau gi cc thay
i i vo c s d liu. LINQ cho SQL chuyn i s thay i vo trong lnh SQL
Cp nht(update)

cp nht mt hng trong c s d liu
1. Truy vn c s d liu cho cc hng c cp nht.
2. Thay i gi tr thnh vin trong i tng LINQ to SQL
3. Gi cc thay i i vi c s d liu.
V d
V d truy vn sau c s d liu cho cc lnh # 11000, v sau thay i cc gi
tr ca ShipName v ShipVia trong kt qu ca i tng Object. Cui cng, cc thay i
vi cc thnh vin cc gi tr c gi n c s d liu nh l thay i trong ShipName
v ShipVia ct.
// Query the database for the row to be updated.
var query =
from ord in db.Orders
where ord.OrderID == 11000
select ord;
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 46


// Execute the query, and change the column values
// you want to change.
foreach (Order ord in query)
{
ord.ShipName = "Mariner";
ord.ShipVia = 2;
// Insert any additional changes to column values.
}
// Submit the changes to the database.
try
{
db.SubmitChanges();
}
catch (Exception e)
{
Console.WriteLine(e);
// Provide for exceptions.
}
VI.6.5 Cp nht
cp nht thng tin c s d liu cho mt mc nhp, u tin ly mc v chnh
sa n trc tip i tng trong m hnh. Sau khi bn sa i i tng, gi
SubmitChanges trn DataContext cp nht c s d liu.
Trong v d sau, tt c cc khch hng ang c ti v t London. Sau , tn
ca thnh ph l thay i t "London" thnh "London - Metro". Cui cng,
SubmitChanges c gi l gi cc thay i i vi c s d liu.
Northwnd nw = new Northwnd(@"northwnd.mdf");

var cityNameQuery =
from cust in nw.Customers
where cust.City.Contains("London")
select cust;

foreach (var customer in cityNameQuery)
{
if (customer.City == "London")
{
customer.City = "London - Metro";
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 47

}
}
nw.SubmitChanges();
VI.7 Cch xa hng trong c s d liu (LINQ to SQL)
Bn c th xo cc hng trong mt c s d liu tng ng bng cch g b cc
i tng LINQ SQL tng ng t tp hp bng lin quan. LINQ cho SQL dch bn
thay i vo lnh DELETE thch hp trong SQL.
LINQ cho SQL khng h tr hoc xc nh hot ng xp tng delete. Nu bn
mun xa mt hng trong bng gp kh khn, bn phi hon tt mt trong cc nhim v
sau:
To rule trn DELETE CASCADE trong rang buc foreign-key trn c s d
S dng m ca bn xa cc i tng con phng i tng cha b xa.
Mt khc, vn c trng hp ngoi l. Xem v d m th 2 cho ch ny
Di y l cc bc tm tt cc DataContex hp l kt ni bn vo c s d liu
Northwind.
VI.7.1 xa hng trong c s d liu
1. Query the database for the row to be deleted.
2. Call the DeleteOnSubmit method.
3. Submit the change to the database.
1. Truy vn c s d liu cho cc hng s c xa.
2. Gi cc phng php DeleteOnSubmit.
3. Gi cc thay i ti c s d liu.
V d:Cc v d m u tin truy vn c s d liu cho cc chi tit theo th t thuc
Order # 11000, nh du nhng chi tit theo th t cho cc lnh xa, v gi cc thay i
ny vo c s d liu.
// Query the database for the rows to be deleted.
var deleteOrderDetails =
from details in db.OrderDetails
where details.OrderID == 11000
select details;
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 48

foreach (var detail in deleteOrderDetails)
{
db.OrderDetails.DeleteOnSubmit(detail);
}
try
{
db.SubmitChanges();
}
catch (Exception e)
{
Console.WriteLine(e);
// Provide for exceptions.
}
Trong v d th hai, mc tiu b l order #10250. M ny kim tra bng
OrderDetails bit c ny Order b b c tr con . Nu Order c tr con,
a tr con u tin v sau Order c nh du xa. DataContext t lnh xa
cui cng trong Order ng sau xa cc lnh gi vo c s d liu ch bng cc
rng buc c s d liu
Northwnd db = new Northwnd(@"c:\northwnd.mdf");
db.Log = Console.Out;
// Specify order to be removed from database
int reqOrder = 10250;
// Fetch OrderDetails for requested order.
var ordDetailQuery =
from odq in db.OrderDetails
where odq.OrderID == reqOrder
select odq;
foreach (var selectedDetail in ordDetailQuery)
{
Console.WriteLine(selectedDetail.Product.ProductID);
db.OrderDetails.DeleteOnSubmit(selectedDetail);
}
// Display progress.
Console.WriteLine("detail section finished.");
Console.ReadLine();
// Determine from Detail collection whether parent exists.
if (ordDetailQuery.Any())
{
Console.WriteLine("The parent is presesnt in the Orders collection.");
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 49

// Fetch Order.
try
{
var ordFetch =
(from ofetch in db.Orders
where ofetch.OrderID == reqOrder
select ofetch).First();
db.Orders.DeleteOnSubmit(ordFetch);
Console.WriteLine("{0} OrderID is marked for deletion.", ordFetch.OrderID);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
Console.ReadLine();
}
}
else
{
Console.WriteLine("There was no parent in the Orders collection.");
}
// Display progress.
Console.WriteLine("Order section finished.");
Console.ReadLine();
try
{
db.SubmitChanges();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
Console.ReadLine();
}
// Display progress.
Console.WriteLine("Submit finished.");
Console.ReadLine();

n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 50

Xa
Xo mt mc t collection v sau gi SubmitChanges trn DataContext
xc nhn s thay i LINQ to SQL, khng xc nhn cc hot ng xa xp tng . Nu
bn mun xa mt hng trong mt bng c cc rng buc chng li n.
Trong v d sau, cc khch hng c ID khch hng l 98128 l ly t cc c s d
liu. Sau , sau khi xc nhn rng cc hng cakhch hng c gi ra, lnh
DeleteOnSubmit c gi l loi b cc i tng t cc b su tp. Cui cng,
SubmitChanges c gi l gi lnh xa ti c s d liu.

Northwnd nw = new Northwnd(@"northwnd.mdf");
var deleteIndivCust =
from cust in nw.Customers
where cust.CustomerID == "98128"
select cust;

if (deleteIndivCust.Count() > 0)
{
nw.Customers.DeleteOnSubmit(deleteIndivCust.First());
nw.SubmitChanges();
}
VI.8 Quy trnh lu tr (LINQ to SQL)
LINQ to SQL s dng cc m hnh i tng trnh by cc quy trnh lu tr
trong c s d liu. Bn dng phng php nh cc quy trnh lu tr d liu bng cc p
dng cc thuc tnh FunctionAttribute khi cn thit v cc thuc tnh ParameterAttribute.
Cc chuyn gia pht trin ng dng s dng Visual Studio thng thng s d dng
Object Relational Designer nh x cc quy trnh lu tr d liu. Ch trong phn
ny ch cho bn cch thit lp v gi cc phng php trong cc ng dng khi bn m
ha d liu.
Phn ny khng m t cch s dng nhng m t cc thc thi cc lnh chn, cp
nht, v xa cc hot ng ca c s d liu
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 51

VI.8.1 Chn, cp nht v xa cc hot ng ca c s d liu trong LINQ to SQL
Bn thc hin cc Chn, cp nht v xa cc hot ng trong LINQ cho SQL bng
cch thm, thay i, v loi b cc i tng trong m hnh i tng. Theo mc nh,
LINQ cho SQL dch cc hnh ng ca bn SQL v gi cc thay i ti c s d liu.
LINQ to SQL cung cp ti a tnh linh hot trong vic thao tc v gia cc thay i
bn thc hin vi cc i tng. Ngay sau khi cc i tng c sn (hoc bng cch
ti chng thng qua mt truy vn, hoc bng cch xy dng li chng), bn c th thay
i chng nh cc i tng tiu biu trong ng dng ca bn. Tc l, bn c th thay
i gi tr ca chng, bn c th thm chng vo tp hp v bn cng c th loi b
chng khi tp hp. LINQ SQL theo di cc thay i v sn sng truyn ti
chng tr li c s d liu khi bn gi SubmitChanges.
Ch : LINQ cho SQL khng h tr hoc ghi nhn cc hot ng xa xp tng. Nu bn
gp kh khn khi mun xa mt hng trong mt bng, bn cn phi hoc l thit lp rule:
ON DELETE CASCADE rang buc v kha trong c s d liu, hoc s dng ca
ring bn xa cc i tng tr em m c th khng cho i tng cha m b xa. Mt
khc vn c ngoi l. on trch sau y s dng lp Customer v Order t c s d liu
mu Northwind.
Northwnd db = new Northwnd(@"c:\Northwnd.mdf");
// Query for a specific customer.
var cust =
(from c in db.Customers
where c.CustomerID == "ALFKI"
select c).First();
// Change the name of the contact.
cust.ContactName = "New Contact";
// Create and add a new Order to the Orders collection.
Order ord = new Order { OrderDate = DateTime.Now };
cust.Orders.Add(ord);
// Delete an existing Order.
Order ord0 = cust.Orders[0];
// Removing it from the table also removes it from the Customers list.
db.Orders.DeleteOnSubmit(ord0);
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 52

// Ask the DataContext to save all the changes.
db.SubmitChanges();
VI.8.2 Cch gi nhng thay i n c s d liu (LINQ to SQL)
Bt k c bao nhiu thay i bn lm cho cc i tng ca bn, ch c thay i
trong bn sao trong b nh. Bn khng c thay i vo d liu cui cng trong c s
d liu. Nhng thay i ca bn khng c chuyn n cc my ch cho n khi bn
gi lnh SubmitChanges trn DataContext.
Khi bn thc hin lnh gi ny, cc DataContext c gng dch cc thay i ca
bn vo lnh SQL tng ng. Bn c th s dng nguyn l thit k my tnh ty thch
ghi nhng hnh ng ny, nhng trt t ca nhng submission c sp xp li
bi mt dch v ca DataContext l: change processor theo trnh t nh sau:
1. Khi bn gi lnh SubmitChanges, LINQ SQL kim tra cc thit lp ca cc i tng
c bit n xc nh xem trng mi c nh km vi chng. Nu chng c,
cc trng hp ny s c thm vo thit lp cc i tng c kim tra.
2. Tt c cc i tng c lnh ang ch thay i c sp xp vo trong vo mt chui
cc i tng da trn cc ph thuc gia chng. Cc i tng c thay i ph thuc
vo cc i tng khc c sp xp sau s ph thuc .
3. Trc khi thc s thay i bt k c truyn, LINQ SQL bt u mt giao dch
tm tt mt chui cc lnh ring l.
Nhng thay i i vi cc i tng c dch tng bc mt vo cc lnh trong
SQL v chuyn vo my ch.
Ti thi im ny, bt k li no pht hin bi cc c s d liu to ra qu trnh
Submision ngng v vn c ngoi l xy ra. Tt c cc thay i trong c s d liu
c cun tr li nu khng c Submission no xut hin. DataContext vn c th ghi
li y tt c s thay i . Ngoi ra, bn c th c gng khc phc s c v gi lnh
SubmitChang nh v d sau: .
V d: Khi giao dch xung quanh Submission thnh cng DataContext chp nhn s thay
i vo cc i tng bng cch b qua cc thng tin v s thay i bn ghi.
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 53

Northwnd db = new Northwnd(@"c:\northwnd.mdf");
// Make changes here.
try
{
db.SubmitChanges();
}
catch (ChangeConflictException e)
{
Console.WriteLine(e.Message);
// Make some adjustments.
// ...
// Try again.
db.SubmitChanges();
}
Cch to mi cc lp c nh x vo cc bng v cc khung nhn trong LINQ to
SQL (O / R Designer). Cc lp trong LINQ to SQL c nh x vo cc bng c s d
liu v c gi l lp thc th. Lp thc th ny nh x ti bn ghi trong khi cc c
tnh ring l ca lp c nh x vo cc ct ring m c th c ghi li. To mi cc
lp thc th da trn bng c s d liu hoc tng quan c s d liu bng cch ko cc
bng hoc nhn t Server Explorer/Database Explorer. O/R Designer to ra cc lp v
p dng vo cc thuc tnh LINQ to SQL c bit kch hot cc chc nng LINQ to
SQL (truyn d liu v hiu chnh cc tnh nng ca DataContext. Thng tin chi tit v
lp LINQ to SQL xem m hnh i tng LINQ to SQL.
Ch : O / R Designer l mt i tng n gin lin quan n nh x d liu bi v n
ch h tr mi quan h mapping 1:1. Ni cch khc, mt t chc lp hc c th ch c
mt 1:1 mapping relationship vi bng c s d liu. Qu trnh chuyn i d liu phc
tp nh nh x entity class vo cc bng phc tp khng c h tr. Tuy nhin, bn c
th nh x entity class ti mt entity class view m c th ni cc bng c lin quan.
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 54

VI.8.3 To cc lp LINQ to SQL c nh x vo bng c s d liu or cc khung
nhn.
Ko cc bng hoc cc khung nhn t Server Explorer / Explorer vo cc O / R
Designer to ra ngoi cc lp thc th . Hn na phng php DataContext l phng
php c s dng thc thi cp nht c s d liu.
Theo mc nh, cc LINQ SQL runtime to ra logic lu cc thay i t mt
entity class c cp nht vo c s d liu. Logic ny c da trn s ca bng
(nh ngha ct v cc thng tin quan trng) Nu bn khng mun hnh ng ny, bn c
th cu hnh mt lp thc th s dng quy trnh lu tr d liu thc thi vic chn, cp
nht, xa thay v s dng cc hot ng mc nh ca LINQ to SQL ti thi gian chy.
Ch : My tnh ca bn c th hin ra cc tn khc nhau hay a phng khc nhau
trong s cc yu t gioa din ngi dng Visual Studio trong hng dn sau. Cc n bn
Visual Studio m bn c v cc thit lp m bn xc nh cc yu t ny.
VI.8.4 to cc lp c nh x vo d liu bng hoc cc khung nhn trong
LINQ to SQL.
1. Trong Server/Database Explorer, m rng Tables or Views v nh v database
table or view m bn mun s dng trong ng dng ca bn.
2. Ko bng hoc View vo trong O/R Designer.
Mt lp thc th c to ra v xut hin trong b mt ca thit k. Lp thc th c c
tnh m nh x vo cc ct trong bng hay View d liu c chn.
To i tng d liu ngun v hin th d liu cho mt Form
Sau khi bn to cc lp thc th bng cch s dng O / R Designer, bn c th to i
tng ngun d liu v nh c Data Sources Window trn cc lp thc th.
to mt i tng ngun d liu da trn cc lp thc th trong SQL LINQ

1. Trn trnh n Build, nhp chut vo Build Solution xy dng cho d n ca bn.
2. Trn trnh n Data, nhp chut vo Show Data Sources
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 55

3. Trn ca s Data Sources, nhp chut vo Add New Data Source.
4. Click vo Object trn trang Choose a Data Source Type v sau nhp chut vo
Next
5. M rng cc nodes v v tr v chn lp ca bn.
Ch : Nu lp khch hng khng sn c, hy trnh wizard, xy dng cc d n, v chy
trnh wizard li.
1. Click vo Finish to ra cc ngun d liu v thm vo v thm vo entity class
Customer vo ca s ngun d liu.
2. Ko cc mc t ca s Data Sources vo trong Form

VII. LINQ to XML
LINQ to XML cung cp giao din lp trnh XML m n by l .NET Language-
Integrated Query (LINQ) Framework. LINQ to XML s dng ngn ng mi nht ca
.NET Framework v c so snh v thit k li vi giao din lp trnh XML Document
Object Model (DOM)
LINQ to XML bao gm cc phng php khc nhau cho php bn c th thay i
s XML mt cch trc tip. bn c th thm cc yu t, xa cc yu t, thay i ni
dung ca mt yu t v thm cc thuc tnh vv. Giao din lp trnh c m t trong
s Modifying XML. Nu bn ang lm li thng qua mt trong cc axis nh Element
v b n ang thay i s XML nh lm l thng qua mt axis nh khi bn lm thng
qua axis, bn c th gp vi mt vi li l. S c ny c bit n nh l "The
Halloween Problem".
VII.1 nh ngha.
Khi bn vit mt vi m s dng LINQ m thng qua mt tp hp, bn ang vit
m vi li vit tng thut. N gn ging nh ci bn mun v hn na l How- bn
mun lm nh th no.
1) Nhn yu t u tin.
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 56

2) Kim tra vi mt vi iu kin.
3) Thay i n.
4) t n tr li danh sch sau s l m bt buc. Bn ang ni vi my tnh rng bn
lm ci bn mun nh th no.
Trn ln vi nhng li vit m ny trong mt s hot ng tng t l ci dn n cc s
c nh sau:
Gi d bn c mt danh sch cc lin kt vi 3 mc (a, b, v c):
a -> b -> c
By gi gi d bn mun chuyn danh sch cc lin kt v thm vo 3 mc mi (a', b', v
c'). Bn mun danh sch cc lin kt c kt qu l:
a -> a' -> b -> b' -> c -> c'
Cho nn bn s vit m thng qua danh sch v cho cc mc khc bn thm mt mc mi
bo bn phi. iu g s xy ra nu m ca bn s nhn thy mt yu t u tin v chn
thm a sau n. By gi m ca bn s chuyn sang nt tip theo trong danh sch m by
gi l a. n s thm vo mt mc mi trong danh sch l a.
Cch x l s c ny trong thc t nh th no? Bn c th c bn copy ca danh
sch cc lin kt gc v to mt danh sch hon ton mi khc. Hoc nu bn ang m
ha lnh, bn c th tm thy mc u tin, thm vo mc mi v sau tin ln pha
trc 2 ln trong danh sch cc lin kt, trn danh sch m bn va thm.
VII.2 Thm vo trong khi lp.
V d, gi s bn mun vit mt vi m cho cc yu t trong mt s , bn mun
to ra mt yu t khc tng t:
XElement root = new XElement("Root",
new XElement("A", "1"),
new XElement("B", "2"),
new XElement("C", "3")
);
foreach (XElement e in root.Elements())
root.Add(new XElement(e.Name, (string)e));
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 57

on m ny i vo vng lp v hn. Trng thi foreach lp li thng qua axis cc
phn t, thm vo cc yu t mi trong doc. N kt thc vic lp i lp li thng qua cc
yu t mi thm vo. V bi v n nh phn cc i tng mi vi vng lp n s chim
ht ton b b nh hin hu.
Bn c th khc phc mt s s c bng cch y cc tp hp s dng cc hot
ng truy vn chun ToList(Tsource) nh sau:
By gi cc m lm vic nh s XML bn di:
VII.3 Xa trong khi lp.
Nu bn mun xa tt c cc nt ti mi thi im bn c th gp ri ro khi vit
m nh v d sau:
XElement root = new XElement("Root",
new XElement("A", "1"),
new XElement("B", "2"),
new XElement("C", "3")
);
foreach (XElement e in root.Elements().ToList())
root.Add(new XElement(e.Name, (string)e));
Console.WriteLine(root);

XElement root = new XElement("Root",
new XElement("A", "1"),
new XElement("B", "2"),
new XElement("C", "3")
);
foreach (XElement e in root.Elements())
e.Remove();
Console.WriteLine(root);

Tuy nhin, iu ny khng phi l ci bn mun. Trong trng hp ny, sau khi
bn g b yu t u tin,n c g b t s XML khng cha gc, v m trong
phng thc Element m ang c lp li khng th tm thy trong cc yu t tip theo.
Quy trnh m trc theo d liu vo sau:
Gii php ny c gi l ToList(TSource) c th ha tp hp nh sau:
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 58

XElement root = new XElement("Root",
new XElement("A", "1"),
new XElement("B", "2"),
new XElement("C", "3")
);
foreach (XElement e in root.Elements().ToList())
e.Remove();
Console.WriteLine(root);
V cui cng bn c th loi tr cc trng hp lp bng cch RemoveAll trong cc yu
t cha:
XElement root = new XElement("Root",
new XElement("A", "1"),
new XElement("B", "2"),
new XElement("C", "3")
);
root.RemoveAll();
Console.WriteLine(root);
VII.4 Ti sao khng th x l LINQ t ng?
Phng php tip cn ny s lun mang li ti nguyn cho b nh thay v ch nh
gi khng. Tuy vy, n s rt tn ti nguyn trong iu kin thc thi v s dng b nh.
Trong thc t, nu LINQ v LINQ to XML l tip cn th n s ri vo tnh hung
tht.
Mt phng php tip cn khc l t vo trong mt trong s c php giao dch
vo trong LINQ v chng trnh bin dch phn tch m v xc nh tp hp c bit
c cn thit c c th ha. Tuy vy, vic c gng xc nh tt c cc m m c
tc ng th yu rt phc tp. Hy xem on m sau:
var z =
from e in root.Elements()
where TestSomeCondition(e)
select DoMyProjection(e);
Nh m s cn phn tch cc phng thc TestSomeCondition v
DoMyProjection v tt c cc phng thc xc nh nu bt k m no c tc ng th
yu. Nhng nu cc m phn tch c th khng th tm ra bt k m no l m th yu. N
s cn phi chn m c tc ng th yu trong cc yu t con ca trong tnh hung ny.
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 59

LINQ to XML khng phn tch. N ph thuc vo s c xy ra.
Hng dn.
u tin khng trn ln m tng thut vi m lnh.
Thm ch khi bn bit chnh xc ng ngha ca n trong tp hp ca bn v ng
ngha ca phng thc m c th thay i trong s XML, nu bn vit mt vi m r
rng trnh c mt s tnh hung xu xy ra, m ca bn s cn phi duy tr bi cc
chuyn gia pht trin ng dng khc trong tng lai v h phi bit r cc vn ny.
Nu bn trn m tng thut vi m lnh, th m ca bn d b b gy hn.
Nu bn vit m c th ha cho mt tp hp cho nn nhng vn ny nn trnh,
ch n vi phn din gii thch hp trong on m ca bn cho nn cc lp trnh vin
bo tr s hiu c vn .
Th hai, nu vic thc thi cho php d dng m tng thut, ng thay i cc s
XML hin c, hy to ra mt s mi
XElement root = new XElement("Root",
new XElement("A", "1"),
new XElement("B", "2"),
new XElement("C", "3")
);
XElement newRoot = new XElement("Root",
root.Elements(),
root.Elements()
);
Console.WriteLine(newRoot);
Thm vo cc yu t, thuc tnh v cc nt trong mt cy XML.
VII.5 Lm th no : vit mt phng thc axis LINQ to XML.
Bn c th vit bng chnh phng php axis xy dng tp hp t s XML.
Cch tt nht lm iu l vit mt phng thc m rng m c th tr v tp hp
cc yu t hay cc thuc tnh. Bn cng c th vit phng thc m rng tr li tp
hp con ca cc yu t hay cc thuc tnh da trn cc yu cu ca ng dng.
V d: V d sau s dng hai phng php m rng. u tin l phng php
GetXPath t chc trn i tng X v tr v biu thc Xpath rng khi c nh gi s
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 60

tr v nt hoc thuc tnh. Phng php th hai l Find, t chc trn yu t X. N tr
v tp hp ca cc i tng Xatribute v i tng Xelement v cha nhng vn bn
c bit.
Ch : V d sau s dng cu trc xy dng tr v yield trong C#. Bi v khng c kha
cnh no tng ng trong Visual Basic 2008, y l mt v d ch c cung cp trong
C#.
public static class MyExtensions
{
private static string GetQName(XElement xe)
{
string prefix = xe.GetPrefixOfNamespace(xe.Name.Namespace);
if (xe.Name.Namespace == XNamespace.None || prefix == null)
return xe.Name.LocalName.ToString();
else
return prefix + ":" + xe.Name.LocalName.ToString();
}

private static string GetQName(XAttribute xa)
{
string prefix =
xa.Parent.GetPrefixOfNamespace(xa.Name.Namespace);
if (xa.Name.Namespace == XNamespace.None || prefix == null)
return xa.Name.ToString();
else
return prefix + ":" + xa.Name.LocalName;
}

private static string NameWithPredicate(XElement el)
{
if (el.Parent != null && el.Parent.Elements(el.Name).Count() != 1)
return GetQName(el) + "[" +
(el.ElementsBeforeSelf(el.Name).Count() + 1) + "]";
else
return GetQName(el);
}

public static string StrCat<T>(this IEnumerable<T> source,
string separator)
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 61

{
return source.Aggregate(new StringBuilder(),
(sb, i) => sb
.Append(i.ToString())
.Append(separator),
s => s.ToString());
}

public static string GetXPath(this XObject xobj)
{
if (xobj.Parent == null)
{
XDocument doc = xobj as XDocument;
if (doc != null)
return ".";
XElement el = xobj as XElement;
if (el != null)
return "/" + NameWithPredicate(el);
// the XPath data model does not include white space text nodes
// that are children of a document, so this method returns null.
XText xt = xobj as XText;
if (xt != null)
return null;
XComment com = xobj as XComment;
if (com != null)
return
"/" +
(
com
.Document
.Nodes()
.OfType<XComment>()
.Count() != 1 ?
"comment()[" +
(com
.NodesBeforeSelf()
.OfType<XComment>()
.Count() + 1) +
"]" :
"comment()"
);
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 62

XProcessingInstruction pi = xobj as XProcessingInstruction;
if (pi != null)
return
"/" +
(
pi.Document.Nodes()
.OfType<XProcessingInstruction>()
.Count() != 1 ?
"processing-instruction()[" +
(pi
.NodesBeforeSelf()
.OfType<XProcessingInstruction>()
.Count() + 1) +
"]" :
"processing-instruction()"
);
return null;
}
else
{
XElement el = xobj as XElement;
if (el != null)
{
return
"/" +
el
.Ancestors()
.InDocumentOrder()
.Select(e => NameWithPredicate(e))
.StrCat("/") +
NameWithPredicate(el);
}
XAttribute at = xobj as XAttribute;
if (at != null)
return
"/" +
at
.Parent
.AncestorsAndSelf()
.InDocumentOrder()
.Select(e => NameWithPredicate(e))
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 63

.StrCat("/") +
"@" + GetQName(at);
XComment com = xobj as XComment;
if (com != null)
return
"/" +
com
.Parent
.AncestorsAndSelf()
.InDocumentOrder()
.Select(e => NameWithPredicate(e))
.StrCat("/") +
(
com
.Parent
.Nodes()
.OfType<XComment>()
.Count() != 1 ?
"comment()[" +
(com
.NodesBeforeSelf()
.OfType<XComment>()
.Count() + 1) + "]" :
"comment()"
);
XCData cd = xobj as XCData;
if (cd != null)
return
"/" +
cd
.Parent
.AncestorsAndSelf()
.InDocumentOrder()
.Select(e => NameWithPredicate(e))
.StrCat("/") +
(
cd
.Parent
.Nodes()
.OfType<XText>()
.Count() != 1 ?
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 64

"text()[" +
(cd
.NodesBeforeSelf()
.OfType<XText>()
.Count() + 1) + "]" :
"text()"
);
XText tx = xobj as XText;
if (tx != null)
return
"/" +
tx
.Parent
.AncestorsAndSelf()
.InDocumentOrder()
.Select(e => NameWithPredicate(e))
.StrCat("/") +
(
tx
.Parent
.Nodes()
.OfType<XText>()
.Count() != 1 ?
"text()[" +
(tx
.NodesBeforeSelf()
.OfType<XText>()
.Count() + 1) + "]" :
"text()"
);
XProcessingInstruction pi = xobj as XProcessingInstruction;
if (pi != null)
return
"/" +
pi
.Parent
.AncestorsAndSelf()
.InDocumentOrder()
.Select(e => NameWithPredicate(e))
.StrCat("/") +
(
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 65

pi
.Parent
.Nodes()
.OfType<XProcessingInstruction>()
.Count() != 1 ?
"processing-instruction()[" +
(pi
.NodesBeforeSelf()
.OfType<XProcessingInstruction>()
.Count() + 1) + "]" :
"processing-instruction()"
);
return null;
}
}

public static IEnumerable<XObject> Find(this XElement source, string value)
{
if (source.Attributes().Any())
{
foreach (XAttribute att in source.Attributes())
{
string contents = (string)att;
if (contents.Contains(value))
yield return att;
}
}
if (source.Elements().Any())
{
foreach (XElement child in source.Elements())
foreach (XObject s in child.Find(value))
yield return s;
}
else
{
string contents = (string)source;
if (contents.Contains(value))
yield return source;
}
}
}
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 66


class Program
{
static void Main(string[] args)
{
XElement purchaseOrders = XElement.Load("PurchaseOrders.xml");

IEnumerable<XObject> subset =
from xobj in purchaseOrders.Find("1999")
select xobj;

foreach (XObject obj in subset)
{
Console.WriteLine(obj.GetXPath());
if (obj.GetType() == typeof(XElement))
Console.WriteLine(((XElement)obj).Value);
else if (obj.GetType() == typeof(XAttribute))
Console.WriteLine(((XAttribute)obj).Value);
}
}
}
V d ny ch ra cch tnh cc tr s trung gian v c th c s dng trong sp xp, lc
v chn d liu.

V d: V d sau s dng mnh let
XElement root = XElement.Load("Data.xml");
IEnumerable<decimal> extensions =
from el in root.Elements("Data")
let extension = (decimal)el.Element("Quantity") * (decimal)el.Element("Price")
where extension >= 25
orderby extension
select extension;
foreach (decimal ex in extensions)
Console.WriteLine(ex);

n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 67

VII.6 Cch to mt ti liu vi Namespaces (LINQ to XML) (C#)
to mt yu t hay mt thuc tnh m l xut hin trong namespace, bn c th
to n vi mt Xname cha mt Xnamespace cha URI mong mun cho namespace.
Mi yu t hay thuc tnh cha mt Xname v mi Xname cha mt Xnamespace. Thm
ch mt yu t khng phi l mt namespace, cc yy t Xname vn cha mt
namespace, c tnh XNamespace.None. The XName.Namespace c bo m s ko b
Null
Bn c ty chn to ra mt thuc tnh namespace trong s XML. Nhng
thuc tnh ny biu th cho namespace. To thuc tnh namespace l cch bn kim sat
c tin t ca namespace v nu mt namespace l mt namespace mc nh.
to mt thuc tnh m c th m t c namespace mc nh vi mt tin t,
bn c th to mt thuc tnh ni m namespace ca thuc tnh tn trong Xmlns v tn
ca thuc tnh l tin t ca namespace. Tr s ca thuc tnh l URI ca namespace
Nu s XML cha cc yu t hau cc thuc tnh trong mt namespace v ny khng
c bt k thuc tnh no c th m t namespace trong sut qu trnh LINQ to XML to ra
cc namespace mc nh hoc to ra cc namespace khng mc nh v gn cc tin t
vo chng.
i tng Xnamespace c m bo s thu nh nu c hai i tng
Xnamespace c chnh xc URI tng t, nh th n s chia s vi nhau trng hp tng
t.
V d: V d sau l v d cho vic to ti liu vi mt namespace bi v ti liu trong v
d ny ch cha duy nht mt namespace v khng c thuc tnh namespace no c th
m t namespace, LINQ to XML s to ra mt namespace mc nh.
// Create an XML tree in a namespace.
XNamespace aw = "http://www.adventure-works.com";
XElement root = new XElement(aw + "Root",
new XElement(aw + "Child", "child content")
);
Console.WriteLine(root);
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 68


V d sau to ra mt ti liu vi mt namespace. N cng to ra mt thuc tnh m
t namespace vi mt tin t namespace. to ra mt thuc tnh m c th m t
namespace vi mt tin t, bn c th to mt thuc tnh ni m namespace ca tn thuc
tnh l Xmlns v tn ca thuc tnh l tin t namespace. Tr s ca thuc tnh ny l URI
ca namespace.
// Create an XML tree in a namespace, with a specified prefix
XNamespace aw = "http://www.adventure-works.com";
XElement root = new XElement(aw + "Root",
new XAttribute(XNamespace.Xmlns + "aw", "http://www.adventure-works.com"),
new XElement(aw + "Child", "child content")
);
Console.WriteLine(root);

V d sau ch ra cch to trong ti liu cha hai namespace. Mt l namespace mc
nh, mt l namespace vi mt tin t.
Bng cch bao gm c thuc tnh namespace trong yu t g, namespace c sp
xp theo tng chui cho nn http://www.adventure-works.com l namespace mc nh v
www.fourthcoffee.com l c nh chui vi mt tin t l fc
// The http://www.adventure-works.com namespace is forced to be the default
namespace.
XNamespace aw = "http://www.adventure-works.com";
XNamespace fc = "www.fourthcoffee.com";
XElement root = new XElement(aw + "Root",
new XAttribute("xmlns", "http://www.adventure-works.com"),
new XAttribute(XNamespace.Xmlns + "fc", "www.fourthcoffee.com"),
new XElement(fc + "Child",
new XElement(aw + "DifferentChild", "other content")
),
new XElement(aw + "Child2", "c2 content"),
new XElement(fc + "Child3", "c3 content")
);
Console.WriteLine(root);

n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 69

V d sau ch ra cch to mt ti liu m c cha hai namespace vi c tin t ca
namespace.
XNamespace aw = "http://www.adventure-works.com";
XNamespace fc = "www.fourthcoffee.com";
XElement root = new XElement(aw + "Root",
new XAttribute(XNamespace.Xmlns + "aw", aw.NamespaceName),
new XAttribute(XNamespace.Xmlns + "fc", fc.NamespaceName),
new XElement(fc + "Child",
new XElement(aw + "DifferentChild", "other content")
),
new XElement(aw + "Child2", "c2 content"),
new XElement(fc + "Child3", "c3 content")
);
Console.WriteLine(root);
Phng php khc cng cho kt qu tng t l s dng tn m rng thay v
m t v to i tng Xnamespace.
Phng php ny thc thi s lin quan. Ti mi thi im bn c th cho qua mt
chui k t m cha cc tn trong LINQ to XML, n phi phn tch tn, tm ra cc
namespace c thu nh. Qu trnh ny chim nhiu ti nguyn ca CPU. Nu vic thc
thi ny quan trng, bn c th mun s dng phng php m c th m t v s dng
i tng Xnamespace mt cch r rng.
// Create an XML tree in a namespace, with a specified prefix
XElement root = new XElement("{http://www.adventure-works.com}Root",
new XAttribute(XNamespace.Xmlns + "aw", "http://www.adventure-works.com"),
new XElement("{http://www.adventure-works.com}Child", "child content")
);Console.WriteLine(root);

VII.7 Cch Stream XML Fragments t mt XmlReader
Khi bn phi x l mt tp tin XML c ln, n c th khng kh thi ti ton b
s XML vo trong b nh. Mt trong nhng cch hiu qu nht l s dng
XmlReader c cc i tng Xelement vit cho phng thc axis ty chnh. Mt
phng thc axis tr li tp hp nh IEnumerable(T) ca Xelement c ch ra trong v
d trong ch ny. Trong phng thc axis ty chnh, sau khi bn to ra on XML
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 70

bng cch gi phng php ReadFrom, tr v tp hp bng cch s dng yield return.
iu ny to ra cc thc hin chm ng ngha cho ty chnh phng thc axis.
Khi bn to mt s cy XML t i tng XmlReader, XmlReader phi c
nh v trong mt yu t. Phng php ReadFrom khng tr li cho ti khi n c c
th ng ca cc phn t.
Nu bn mun to mt s cy theo tng phn, bn c th chng minh mt
XmlReader, v tr ca reader trn node m bn mun chuyn sang s cy Xelement v
sau to cc i tng Xelement.

V d: V d ny to ra mt ty chnh phng php axis. Bn c th truy vn n bng
cch s dng mt truy vn LINQ. Cc ty chnh phng thc axis, StreamRootChildDoc,
l mt phng php c thit k c bit c mt ti liu c lp li mt yu t Child.

Ch :V d sau s dng cu trc yield return ca C # bi v khng c tnh nng tng
ng trong Visual Basic 2008, v d ny ch c cung cp trong C #.
static IEnumerable<XElement> StreamRootChildDoc(StringReader stringReader)
{
using (XmlReader reader = XmlReader.Create(stringReader))
{
reader.MoveToContent();
// Parse the file and display each of the nodes.
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
if (reader.Name == "Child") {
XElement el = XElement.ReadFrom(reader) as XElement;
if (el != null)
yield return el;
}
break;
}
}
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 71

}
}

static void Main(string[] args)
{
string markup = @"<Root>
<Child Key=""01"">
<GrandChild>aaa</GrandChild>
</Child>
<Child Key=""02"">
<GrandChild>bbb</GrandChild>
</Child>
<Child Key=""03"">
<GrandChild>ccc</GrandChild>
</Child>
</Root>";

IEnumerable<string> grandChildData =
from el in StreamRootChildDoc(new StringReader(markup))
where (int)el.Attribute("Key") > 1
select (string)el.Element("GrandChild");

foreach (string str in grandChildData) {
Console.WriteLine(str);
}
}

VII.8 Cch to mt s (Tree) t mt XmlReader.
Ch ny ch cho bn cch to mt s trc tip t mt XmlReader. to
mt Xelement t mt XmlReader, bn phi nh v XmlReader trn mt node.
XmlReader s b qua nhng thnh phn v x l cc hng dn, nhng nu XmlReader
c nh v trn node vn bn th s xut hin mt li. trnh nhng li th bn
lun lun phi nh v XmlReader trn element trc khi bn to mt s XML (Cy
XML) t XmlReader.
V d: M sau to ra mt i tng T:System.Xml.XmlReader v sau c cc node
cho n khi n tm ra element node u tin v ti i tng XElement.
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 72

XmlReader r = XmlReader.Create("books.xml");
while (r.NodeType != XmlNodeType.Element)
r.Read();
XElement e = XElement.Load(r);
Console.WriteLine(e);

VII.9 Thay i cy XML trn b nh trong so vi Functional Construction (LINQ
to XML)
Vic thay i mt cy XML ti mt v tr l cch tip cn truyn thng thay
i hnh dng ca mt ti liu XML. Mt ng dng ni bt ti mt ti liu vo lu tr
nh DOM hoc LINQ to XML; s dng mt giao din lp trnh chn nodes, xa
nodes, hoc thay i ni dung ca nodes; v sau lu l mt tp tin XML chuyn n
qua mng my tnh, LINQ to XML cho php cch tip cn m c ch trong nhiu kch
bn: functional construction.. functional construction lm thay i cc d liu nh l mt
vn ca qu trnh chuyn i. Nu bn c th biu din d liu hay chuyn n t mu
ny qua mu khc m cho mt kt qu tng t nh khi bn ly d liu v thao tc n
sang mt dng khc. iu quan trng i vi phng php functional construction l
b qua kt qu ca truy vn vi XDocument v XElement constructors.
Trong nhiu trng hp, bn c th vit cc m truyn d liu trong khong thi
gian ngn m n c th tao tc cc kho lu tr d liu v m s mnh hn v d dng
duy tr hn. Trong nhng trng hp ny, mc d cc phng php truyn d liu c th
tn nhiu ti nguyn x l ca my tnh , l mt cch hiu qu hn sa i d liu.
Nu mt chuyn gia pht trin ng dng lm quen vi phng php ny th trong
nhiu trng hp s hiu hn. V cng s d dng hn tm m m c th thay i mi
phn ca cy.
Ch ny cung cp mt v d m t l trin khai thc hin vi c hai phng
php tip cn. Cc phng php tip cn ni bn sa i mt XML cy ti ch l quen
thuc c thm nhiu DOM lp trnh, trong khi m vn bn bng cch s dng chc
nng, cch tip cn c th hnh khng quen thuc vi mt ngi pht trin, khng c g
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 73

cha hiu rng cch tip cn. Nu bn c phi ch lm cho mt nh sa i, b sung
mt XML cy ln, cc phng php tip cn ni bn sa i mt cy ni trong nhiu
trng hp CPU s mt t thi gian.
VII.10 Chuyn i thuc tnh vo cc phn t.
i vi v d ny, gi s bn mun sa i cc ti liu XML n gin sau ,
tr thnh yu t thuc tnh. Ch ny trnh by cc truyn thng u tin ti-ch sa
i cch tip cn. Sau n cho thy cc chc nng xy dng phng php tip cn.
VII.10.1 Chnh sa mt cy XML.
Bn c th vit mt s m to t cc thnh phn thuc tnh, v sau xa cc
thuc tnh, nh sau.
XElement root = XElement.Load("Data.xml");
foreach (XAttribute att in root.Attributes()) {
root.Add(new XElement(att.Name, (string)att));
}
root.Attributes().Remove();
Console.WriteLine(root);
VII.10.2 Cch tip cn Functional Construction.
Ngc li, mt phng php tip cn bao gm cc chc nng m to thnh mt
cy mi, chn v la chn thnh phn v cc thuc tnh t cc ngun gc cy, v chuyn
chng trong trng hp thch hp khi chng c a vo cc cy mi. Phng php
tip cn cc chc nng nh sau:
XElement root = XElement.Load("Data.xml");
XElement newTree = new XElement("Root",
root.Element("Child1"),
from att in root.Attributes()
select new XElement(att.Name, (string)att)
);
Console.WriteLine(newTree);
V d ny kt qu u ra trong cng mt XML v d nh l ngi u tin. Tuy
nhin, thng bo rng bn c th thc s xem cc kt qu ca cc cu trc XML mi
trong chc nng, cch tip cn. Bn c th xem thng sng to ca ngi dn gc nguyn
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 74

t, rng hai bn nguyn t Child1 t ngun gc cy, v m chuyn bin rng thuc tnh t
cy ngun yu t mi trong cy.
Cc chc nng nh trong trng hp ny khng phi l bt k ngn hn l ngi
u tin v d, v n khng phi l bt k thc s n gin. Tuy nhin, nu bn c nhiu
thay i lm cho mt XML cy, cc phng php tip cn khng chc nng s tr nn
kh phc tp v i cht m h. Ngc li, khi s dng cc chc nng, cch tip cn, bn
ch cn nhn chut mong mun XML, a vo truy vn v biu thc nh l thch hp,
ko trong ni dung mong mun. Cc m sn lng chc nng, cch tip cn c d
dng hn duy tr.
Ch rng trong trng hp ny, cch tip cn cc chc nng c l s khng thc
hin kh cng nh cc cy. Cc vn chnh l cch tip cn cc chc nng to thm
ngn sng cc i tng. Tuy nhin, s cn bng l mt hiu qu nht nu s dng cc
chc nng cho php cc phng php tip cn ln hn cho cc lp trnh hiu qu.
y l mt v d n gin, nhng n phc v hin th s khc bit trong trit l
gia hai phng php tip cn. Phng php tip cn cc chc nng sn xut t sn
lng ln cho vic chuyn cc ti liu XML ln hn.
Ch rng trong trng hp ny, cch tip cn cc chc nng c l s khng thc
hin kh cng nh cc cy s dng cch tip cn bng tay. Cc vn chnh l cch tip
cn cc chc nng to thm ngn sng cc i tng. Tuy nhin, s cn bng l mt hiu
qu nht nu s dng cc chc nng cho php cc phng php tip cn ln hn cho cc
lp trnh hiu qu
VII.10.3 Removing Elements, Attributes, and Nodes from an XML Tree
Bn c th sa i mt XML cy, loi b cc phn t, thuc tnh, v cc loi
nodes. Xo b mt nguyn t hoc mt thuc tnh t mt ti liu XML l n gin. Tuy
nhin, khi loi b cc b su tp ca yu t hay thuc tnh, trc tin bn cn mt b su
tp vo mt danh sch, v sau xa cc yu t hoc thuc tnh t danh sch. Cch tip
cn tt nht l s dng cc phng thc m rng, m s lm vic ny cho bn.
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 75

L do chnh cho cng vic ny l hu ht cc b su tp ca bn ly t mt cy
ang c yielded XML bng cch s dng thc hin lm chm. Nu bn khng lm chng
xut hin u tin vo mt danh sch, hoc nu bn khng s dng cc phng php m
rng c th gp mt li ca mt s lp.
Nhng phng thc sau y xo b nodes v cc thuc tnh t mt cy XML
[M:System.Xml.Linq.XAttribute.Remove()] Loi b mt XAttribute t cha m
ca n.
[M:System.Xml.Linq.XContainer.RemoveNodes()] Loi b cc nodes con t mt
XContainer.
XElement.RemoveAll Loi b ni dung v cc thuc tnh
t mt XElement.
XElement.RemoveAttributes Loi b cc thuc tnh ca mt
XElement.
XElement.SetAttributeValue Nu bn b qua cho cc gi tr
null, sau loi b cc thuc tnh.
XElement.SetElementValue Nu bn b qua cho cc gi tr
null, sau loi b cc phn t
con.
XNode.Remove Loi b mt XNode t cha m ca
n.
Extensions.Remove Loi b tt c cc thuc tnh hay
phn t trong ngun thu t mt
lot phn t gc.
M t.
V d ny chng minh ba phng php tip cn loi b cc phn t. Trc
tin, n loi b mt phn t. Th hai, n truy mt tp hp cc phn t, cho hin chng
bng cch s dng Enumerable.ToList (TSource), v loi b nhng b su tp. Cui
cng, n truy xut mt tp hp cc phn t v loi b chng bng cch s dng cc
phng php m rng.
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 76

Code
XElement root = XElement.Parse(@"<Root>
<Child1>
<GrandChild1/>
<GrandChild2/>
<GrandChild3/>
</Child1>
<Child2>
<GrandChild4/>
<GrandChild5/>
<GrandChild6/>
</Child2>
<Child3>
<GrandChild7/>
<GrandChild8/>
<GrandChild9/>
</Child3>
</Root>");
root.Element("Child1").Element("GrandChild1").Remove();
root.Element("Child2").Elements().ToList().Remove();
root.Element("Child3").Elements().Remove();
Console.WriteLine(root);

V d: rng cc yu t u tin, chu ngoi c xo khi Child1. Chu tt c
cc yu t c xo khi Child2 v t Child3. Khi bn gi mt trong nhng phng
php m tr li IEnumerable (T) ca XElement, bn c th lc trn cc yu t tn.
XElement po = XElement.Load("PurchaseOrder.xml");
IEnumerable<XElement> items =
from el in po.Descendants("ProductName")
select el;
foreach(XElement prdName in items)
Console.WriteLine(prdName.Name + ":" + (string) prdName);

Cc phng php khc m tr v IEnumerable (T) ca XElement b su tp theo
cng mt khun mu. Ch k ca h l tng t vi yu t v Descendants. Sau y l
danh sch y cc phng php c phng php tng t ch k
Ancestors
Descendants
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 77

Elements
ElementsAfterSelf
ElementsBeforeSelf
AncestorsAndSelf
DescendantsAndSelf
Cc phn t.
AncestorsAndSelf
Ancestors
Descendants
ElementsAfterSelf
ElementsBeforeSelf
DescendantsAndSelf
.
V d sau hin th cng mt truy vn cho XML l trong mt namespace.
XNamespace aw = "http://www.adventure-works.com";
XElement po = XElement.Load("PurchaseOrderInNamespace.xml");
IEnumerable<XElement> items =
from el in po.Descendants(aw + "ProductName")
select el;
foreach (XElement prdName in items)
Console.WriteLine(prdName.Name + ":" + (string)prdName);

VII.10.4 Lm th no : Lc trn mt Ty chn Element.
V d: i khi bn mun lc cho mt yu t mc d bn khng chc chn n tn
ti trong ti liu XML ca bn. Nn vic tm kim c thc hin nh vy l nu cc yu
t, khng c g c bit khng c cc yu t con, bn khng kch hot mt tham chiu
null ngoi l bng cch lc cho n. Trong v d sau, cc yu t Child5 khng c mt yu
t Loi hnh child, nhng vn cn thi cc truy vn mt cch chnh xc.

XElement root = XElement.Parse(@"<Root>
<Child1>
<Text>Child One Text</Text>
<Type Value=""Yes""/>
</Child1>
<Child2>
<Text>Child Two Text</Text>
<Type Value=""Yes""/>
</Child2>
<Child3>
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 78

<Text>Child Three Text</Text>
<Type Value=""No""/>
</Child3>
<Child4>
<Text>Child Four Text</Text>
<Type Value=""Yes""/>
</Child4>
<Child5>
<Text>Child Five Text</Text>
</Child5>
</Root>");
var cList =
from typeElement in root.Elements().Elements("Type")
where (string)typeElement.Attribute("Value") == "Yes"
select (string)typeElement.Parent.Element("Text");
foreach(string str in cList)
Console.WriteLine(str);

V d sau hin th cng mt truy vn cho XML l trong mt namespace.
XElement root = XElement.Parse(@"<Root xmlns='http://www.adatum.com'>
<Child1>
<Text>Child One Text</Text>
<Type Value=""Yes""/>
</Child1>
<Child2>
<Text>Child Two Text</Text>
<Type Value=""Yes""/>
</Child2>
<Child3>
<Text>Child Three Text</Text>
<Type Value=""No""/>
</Child3>
<Child4>
<Text>Child Four Text</Text>
<Type Value=""Yes""/>
</Child4>
<Child5>
<Text>Child Five Text</Text>
</Child5>
</Root>");
XNamespace ad = "http://www.adatum.com";
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 79

var cList =
from typeElement in root.Elements().Elements(ad + "Type")
where (string)typeElement.Attribute("Value") == "Yes"
select (string)typeElement.Parent.Element(ad + "Text");
foreach (string str in cList)
Console.WriteLine(str);
VII.10.5 Lm th no : Tm mt n Descendant r Phng thc s dng.
Bn c th s dng mt r phng thc axis nhanh chng vit m tm mt
phn t c tn duy nht. K thut ny l c bit hu ch khi bn mun tm mt phn t
con vi mt tn c th. Bn c th vit m iu hng ti cc yu t mong mun,
nhng thng l nhanh hn v d dng hn vit m bng cch s dng r axis.
V d:V d ny s dng cc nh iu hnh u tin t tiu chun yu cu tm kim
XElement root = XElement.Parse(@"<Root>
<Child1>
<GrandChild1>GC1 Value</GrandChild1>
</Child1>
<Child2>
<GrandChild2>GC2 Value</GrandChild2>
</Child2>
<Child3>
<GrandChild3>GC3 Value</GrandChild3>
</Child3>
<Child4>
<GrandChild4>GC4 Value</GrandChild4>
</Child4>
</Root>");
string grandChild3 = (string)
(from el in root.Descendants("GrandChild3")
select el).First();
Console.WriteLine(grandChild3);

VII.10.6 Lm th no : Tm tt c cc Nodes trong mt Namespace.
Bn c th lc trn namespace ca mi phn t hay thuc tnh tm tt c cc
nodes trong c bit l namespace.
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 80

V d sau to ra mt XML cy vi namepace. Sau n lp li thng qua cc cy
v cc bn in tranh tn ca tt c cc phn t v cc thuc tnh trong mt trong nhng
namespace.
string markup = @"<aw:Root xmlns:aw='http://www.adventure-works.com'
xmlns:fc='www.fourthcoffee.com'>
<fc:Child1>abc</fc:Child1>
<fc:Child2>def</fc:Child2>
<aw:Child3>ghi</aw:Child3>
<fc:Child4>
<fc:GrandChild1>jkl</fc:GrandChild1>
<aw:GrandChild2>mno</aw:GrandChild2>
</fc:Child4>
</aw:Root>";
XElement xmlTree = XElement.Parse(markup);
Console.WriteLine("Nodes in the http://www.adventure-works.com namespace");
IEnumerable<XElement> awElements =
from el in xmlTree.Descendants()
where el.Name.Namespace == "http://www.adventure-works.com"
select el;
foreach (XElement el in awElements)
Console.WriteLine(el.Name.ToString());
Cc tp tin XML c truy cp bng cch truy vn cha cc th t trong hai
namespace khc nhau. Cc truy vn to ra mt cy mi ch vi cc yu t trong mt trong
nhng namespace.

XDocument cpo = XDocument.Load("ConsolidatedPurchaseOrders.xml");
XNamespace aw = "http://www.adventure-works.com";
XElement newTree = new XElement("Root",
from el in cpo.Root.Elements()
where el.Name.Namespace == aw
select el
);
Console.WriteLine(newTree);
VII.10.7 Lm th no : Tm mt phn t vi phn t c th.
Ch ny cho thy nh th no tm mt phn t m phn t c mt child vi mt gi
tr c th.
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 81

V d khi th nghim thy rng c mt phn t CommandLine phn t con vi gi tr ca
Examp2.EXE".
XElement root = XElement.Load("TestConfig.xml");
IEnumerable<XElement> tests =
from el in root.Elements("Test")
where (string)el.Element("CommandLine") == "Examp2.EXE"
select el;
foreach (XElement el in tests)
Console.WriteLine((string)el.Attribute("TestId"));
VII.10.8 Lm th no : Tm mt Element vi mt thuc tnh c th.
Ch ny cho thy lm th no tm mt yu t m c mt thuc tnh c mt
gi tr c th. V d cho thy nh th no tm da ch phn t.

XElement root = XElement.Load("PurchaseOrder.xml");
IEnumerable<XElement> address =
from el in root.Elements("Address")
where (string)el.Attribute("Type") == "Billing"
select el;
foreach (XElement el in address)
Console.WriteLine(el);

V d ny s dng cc ti liu XML sau y:
XElement root = XElement.Load("PurchaseOrderInNamespace.xml");
XNamespace aw = "http://www.adventure-works.com";
IEnumerable<XElement> address =
from el in root.Elements(aw + "Address")
where (string)el.Attribute(aw + "Type") == "Billing"
select el;
foreach (XElement el in address)
Console.WriteLine(el);
VII.10.9 Lm th no : Tm Descendants vi mt c th Element namespace.
i khi bn mun tm thy tt c descendants vi mt ci tn ring. Bn c th
vit m lp qua tt c cc phn t con, nhng n c d dng hn khi s dng r
axis.
V d: V d sau cho thy nh th no tm descendants da trn cc yu t tn
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 82

XElement root = XElement.Parse(@"<root>
<para>
<r>
<t>Some text </t>
</
VII.10.10 Lm th no : To vn bn t tp tin XML.
V d ny cho thy nh th no to ra mt gi tr phn cch bng du phy
(CSV) tp tin t mt tp tin XML
V d: Phin bn C # ca v d ny s dng c php phng thc tng hp v cc nh
iu hnh to ra mt tp CSV t mt ti liu XML trong mt biu thc n l.
V d ny s dng cc ti liu XML sau y:
XElement custOrd = XElement.Load("CustomersOrders.xml");
string csv =
(from el in custOrd.Element("Customers").Elements("Customer")
select
String.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9}{10}",
(string)el.Attribute("CustomerID"),
(string)el.Element("CompanyName"),
(string)el.Element("ContactName"),
(string)el.Element("ContactTitle"),
(string)el.Element("Phone"),
(string)el.Element("FullAddress").Element("Address"),
(string)el.Element("FullAddress").Element("City"),
(string)el.Element("FullAddress").Element("Region"),
(string)el.Element("FullAddress").Element("PostalCode"),
(string)el.Element("FullAddress").Element("Country"),
Environment.NewLine
)
)
.Aggregate(
new StringBuilder(),
(sb, s) => sb.Append(s),
sb => sb.ToString()
);
Console.WriteLine(csv);

n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 83

VII.10.11 Lm th no : to ra h ng cp bng cch s dng nhm.
V d ny cho thy nh th no nhm d liu, v sau to ra XML da trn
cc nhm.
V d:V d ny ln u tin mt nhm d liu theo th loi, sau mi to ra mt tp
tin XML, trong XML Hierarchy phn nh cc nhm.

V d ny s dng cc ti liu XML sau y:
XElement doc = XElement.Load("Data.xml");
var newData =
new XElement("Root",
from data in doc.Elements("Data")
group data by (string)data.Element("Category") into groupedData
select new XElement("Group",
new XAttribute("ID", groupedData.Key),
from g in groupedData
select new XElement("Data",
g.Element("Quantity"),
g.Element("Price")
)
)
);
Console.WriteLine(newData);
VII.10.12 Lm th no : Join hai b su tp.
Mt phn t hoc thuc tnh trong mt ti liu XML i khi c th tham giao cc
phn t khc, hay thuc tnh. V d, cc khch hng t hng v cc ti liu XML c
cha mt danh sch cc khch hng v mt danh sch cc n t hng. Tt c cc yu t
khch hng c cha mt thuc tnh ID khch hng. Tt c cc yu t n hng c cha
mt yu t ID khch hng. ID khch hng cc yu t trong mi n hng tham chiu n
cc thuc tnh ID khch hng trong mt khch hang.
Ch mu XSD File: Khch hng t hng v cha mt XSD c th c s
dng xc minh ti liu ny. N dng xs: cha kha v xs: keyref cc tnh nng ca
XSD thit lp cc thuc tnh ID khch hng ca cc khch hng l mt yu t ch
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 84

cht, v thit lp mt mi quan h gia cc yu t ID khch hng mi n hng v
cc yu t ID khch hng thuc tnh trong mi yu t khch hng.
Vi LINQ to XML, bn c th tn dng cc mi quan h ny bng cch s dng mnh
join.
Lu rng v khng c ch mc c sn, nh vy join s c hiu sut km ti thi gian
chy.
V d: V d sau join cc yu t khch hng n yu t n hng, v to ra mt ti liu
XML mi trong bao gm cc yu t CompanyName trong n t hng.
Trc khi thi hnh cc truy vn, v d validates rng cc ti liu tun th vi cc
schema trong mu XSD File: Khch hng v t hng. iu ny m bo rng mnh
join s lun lun lm vic.
Truy vn ny trc tin tr v t c cc phn t khch hng, v sau join chng
vo yu t n hng. N ch la chn cc n t hng cho khch hng vi mt ID khch
hng ln hn "K". Sau n l mt d n mi t hng yu t c cha cc thng tin
khch hng trong phm vi ca mi n t hng.

V d ny s dng cc ti liu XML sau y: Lu rng join trong thi trang ny s
khng thc hin rt tt. Tham gia c thc hin thng qua mt tm kim tuyn tnh.
Hin khng c trong bng bm hoc lp ch mc gip vi hiu qu hot ng.
XmlSchemaSet schemas = new XmlSchemaSet();
schemas.Add("", "CustomersOrders.xsd");

Console.Write("Attempting to validate, ");
XDocument custOrdDoc = XDocument.Load("CustomersOrders.xml");

bool errors = false;
custOrdDoc.Validate(schemas, (o, e) =>
{
Console.WriteLine("{0}", e.Message);
errors = true;
});
Console.WriteLine("custOrdDoc {0}", errors ? "did not validate" : "validated");
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 85


if (!errors)
{
// Join customers and orders, and create a new XML document with
// a different shape.

// The new document contains orders only for customers with a
// CustomerID > 'K'
XElement custOrd = custOrdDoc.Element("Root");
XElement newCustOrd = new XElement("Root",
from c in custOrd.Element("Customers").Elements("Customer")
join o in custOrd.Element("Orders").Elements("Order")
on (string)c.Attribute("CustomerID") equals
(string)o.Element("CustomerID")
where ((string)c.Attribute("CustomerID")).CompareTo("K") > 0
select new XElement("Order",
new XElement("CustomerID", (string)c.Attribute("CustomerID")),
new XElement("CompanyName", (string)c.Element("CompanyName")),
new XElement("ContactName", (string)c.Element("ContactName")),
new XElement("EmployeeID", (string)o.Element("EmployeeID")),
new XElement("OrderDate", (DateTime)o.Element("OrderDate"))
)
);
Console.WriteLine(newCustOrd);
}
VII.10.13 Lm th no : Load XML t mt tp.
Ch ny cho thy nh th no ti XML t mt URI bng cch s dng
phng thc XElement.Load
V d:V d sau cho thy nh th no ti mt XML ti liu t mt tp tin. V d sau
ti books.xml v u ra ca cy XML bn iu khin.
V d ny s dng cc ti liu XML sau y:
XElement booksFromFile = XElement.Load(@"books.xml");
Console.WriteLine(booksFromFile);
VII.11 Sa i XML Trees.
LINQ to XML l mt trong b nh lu tr cho mt cyXML. Sau khi bn ti hoc
phn tch c php XML mt cy t mt ngun, LINQ to XML cho php bn sa i
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 86

cy, v sau xauats bn cc cy, c l n tit kim mt tp tin hoc gi n cho mt
my ch t xa.
Khi bn sa i mt cy ch, bn s dng mt s phng thc, chng hn nh
thm. Tuy nhin, l mt cch tip cn s dng chc nng xy dng to ra mt
cy mi vi mt hnh dng khc nhau. Ty thuc vo loi thay i m bn cn phi lm
cy XML ca bn, v ty thuc vo kch c ca cy, cch tip cn ny c th c
thm mnh m v d dng hn pht trin. Ch u tin trong phn ny so snh hai
phng php tip cn.
VII.11.1 Lm th no : Vit mt truy vn m cc phn t da trn bi cnh.
i khi bn c th vit mt truy vn m s la chn da trn cc yu t bi cnh
ca h. Bn c th mun lc da trn trc hay cc yu t sau y A / C / E . Bn c th
mun lc da trn con hoc cc phn t.
Bn c th lm c iu ny bng cch vit mt truy vn v s dng cc kt qu ca cc
truy vn trong mnh where. Nu bn c bi kim tra u tin khc null, v sau th
nghim cc gi tr, l thun tin hn truy vn lm vic trong mt mnh let, v
sau s dng cc kt qu trong mnh where.
V d:V d sau p chn tt c cc yu t l ngay lp tc, theo sau l mt yu t ul
XElement doc = XElement.Parse(@"<Root>
<p id=""1""/>
<ul>abc</ul>
<Child>
<p id=""2""/>
<notul/>
<p id=""3""/>
<ul>def</ul>
<p id=""4""/>
</Child>
<Child>
<p id=""5""/>
<notul/>
<p id=""6""/>
<ul>abc</ul>
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 87

<p id=""7""/>
</Child>
</Root>");

IEnumerable<XElement> items =
from e in doc.Descendants("p")
let z = e.ElementsAfterSelf().FirstOrDefault()
where z != null && z.Name.LocalName == "ul"
select e;

foreach (XElement e in items)
Console.WriteLine("id = {0}", (string)e.Attribute("id"));
V d sau hin th cng mt truy vn cho XML l trong mt namespace.
XElement doc = XElement.Parse(@"<Root xmlns='http://www.adatum.com'>
<p id=""1""/>
<ul>abc</ul>
<Child>
<p id=""2""/>
<notul/>
<p id=""3""/>
<ul>def</ul>
<p id=""4""/>
</Child>
<Child>
<p id=""5""/>
<notul/>
<p id=""6""/>
<ul>abc</ul>
<p id=""7""/>
</Child>
</Root>");

XNamespace ad = "http://www.adatum.com";

IEnumerable<XElement> items =
from e in doc.Descendants(ad + "p")
let z = e.ElementsAfterSelf().FirstOrDefault()
where z != null && z.Name == ad.GetName("ul")
select e;

foreach (XElement e in items)
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 88

Console.WriteLine("id = {0}", (string)e.Attribute("id"));
VII.11.2 Lm th no : Vit truy vn vi lc phc tp.
i khi bn mun vit LINQ truy vn XML voeis cc b lc phc tp. V d,
bn c th tm tt c cc yu t c mt yu t con bng mt ci tn ring v gi tr.
V d: V d ny cho thy nh th no tm tt c cc phn t PurchaseOrder rng c
mt Address phn t c mt ngh thuc tnh l " Shipping ". N s dng mt truy vn
lng trong mng where, v cc nh iu hnh tr v gi tr true v bt k gi tr tr v
l true, nu b su tp c bt k phn t no trong n.
Sau y l on v d:
XElement root = XElement.Load("PurchaseOrders.xml");
IEnumerable<XElement> purchaseOrders =
from el in root.Elements("PurchaseOrder")
where
(from add in el.Elements("Address")
where
(string)add.Attribute("Type") == "Shipping" &&
(string)add.Element("State") == "NY"
select add)
.Any()
select el;
foreach (XElement el in purchaseOrders)
Console.WriteLine((string)el.Attribute("PurchaseOrderNumber"));

V d sau hin th cng mt truy vn cho XML l trong mt namespace.
V d ny s dng cc ti liu XML sau y:
XElement root = XElement.Load("PurchaseOrdersInNamespace.xml");
XNamespace aw = "http://www.adventure-works.com";
IEnumerable<XElement> purchaseOrders =
from el in root.Elements(aw + "PurchaseOrder")
where
(from add in el.Elements(aw + "Address")
where
(string)add.Attribute(aw + "Type") == "Shipping" &&
(string)add.Element(aw + "State") == "NY"
select add)
.Any()
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 89

select el;
foreach (XElement el in purchaseOrders)
Console.WriteLine((string)el.Attribute(aw + "PurchaseOrderNumber"));



VII.11.3 Lm th no : Truy vn LINQ s dng XML xpath.
Ch ny gii thiu cc phng thc m rng cho php bn truy vn mt XML
bng cch dng xpath cy.
Tr khi bn c mt l do rt c th cho cc cu hi bng cch s dng xpath,
chng hn nh s dng rng ri ca tha m, bng cch s dng xpath vi LINQ to XML
khng phi l khuyn khch. Xpath truy vn s khng thc hin cng nh LINQ
truy vn XML.
V d:V d sau to mt XML cy nh v s dng XPathSelectElements chn mt b
cc phn t.
XElement root = new XElement("Root",
new XElement("Child1", 1),
new XElement("Child1", 2),
new XElement("Child1", 3),
new XElement("Child2", 4),
new XElement("Child2", 5),
new XElement("Child2", 6)
);
IEnumerable<XElement> list = root.XPathSelectElements("./Child2");
foreach (XElement el in list)
Console.WriteLine(el);

VII.11.4 Lm th no : Xp sp cc phn t.
on m sau cho thy vic xp sp cc phn t nh th no.
XElement root = XElement.Load("Data.xml");
IEnumerable<decimal> prices =
from el in root.Elements("Data")
let price = (decimal)el.Element("Price")
orderby price
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 90

select price;
foreach (decimal el in prices)
Console.WriteLine(el);
VII.11.5 Lm th no : xp sp cc phn t c nhiu kha.
XElement co = XElement.Load("CustomersOrders.xml");
var sortedElements =
from c in co.Element("Orders").Elements("Order")
orderby (string)c.Element("ShipInfo").Element("ShipPostalCode"),
(DateTime)c.Element("OrderDate")
select new {
CustomerID = (string)c.Element("CustomerID"),
EmployeeID = (string)c.Element("EmployeeID"),
ShipPostalCode = (string)c.Element("ShipInfo").Element("ShipPostalCode"),
OrderDate = (DateTime)c.Element("OrderDate")
};
foreach (var r in sortedElements)
Console.WriteLine("CustomerID:{0} EmployeeID:{1} ShipPostalCode:{2}
OrderDate:{3:d}", r.CustomerID, r.EmployeeID, r.ShipPostalCode, r.OrderDate);

VII.11.6 Lm th no : Xp sp theo chnh sch thc hin chuyn i ca ti
liu XML ln.
i khi, bn cn phi chuyn i ln cc file XML, v vit ng dng ca bn ,
du vt b nh ca ng dng l c th on trc. Nu bn c gng a n mt
XML cy vi mt tp tin XML rt ln, b nh ca bn s c s dng tng ng t
l vi kch thc ca tp tin (c ngha l, qu nhiu). V vy, bn nn s dng mt k
thut xp sp theo chnh sch, thay v s dng cc k thut khc.
K thut sp xp theo chnh sch p dng tt nht trong tnh hung m bn cn
x l cc ngun ti liu ch mt ln, v bn c th x l cc yu t trong ti liu th t.
Truy vn vn hnh mt tiu chun nht nh, chng hn nh OrderBy,lp li ngun ca
mnh, thu thp tt c cc d liu, phn loi n, v sau cui cng tr v phn t u tin
trong dy. Lu rng nu bn s dng mt truy vn m nh iu hnh cho hin ra ngun
trc khi tr v mc u tin, bn s khng gi li mt du chn nh trong b nh cho
ng dng ca bn.
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 91

y c hai phng thc tip cn chnh. Mt cch tip cn l s dng nhng
c im ca XStreamingElement. Mt cch tip cn l to ra mt XmlWriter, v s
dng kh nng ca LINQ to XML vit cc phn t ti mt XmlWriter. Ch ny
chng minh c hai phng php tip cn trn.
V d: V d ny s dng lm chm kh nng thc hin ca XStreamingElement cho cc
lung u ra. V d ny c th chuyn i mt ti liu rt ln trong khi vn duy tr mt
du vt b nh.
Lu rng ty chnh axis (StreamCustomerItem) l mt cch c th bng cch
vit n cho rng ti liu c Customer, Name v cc phn t, v rng nhng phn t s
c b tr nh sau Source.xml trong ti liu. Mt chi tit mnh m vic trin khai thc
hin, tuy nhin, bn s c chun b phn tch c php cho mt ti liu khng hp l.
The following is the source document, Source.xml:
static IEnumerable<XElement> StreamCustomerItem(string uri)
{
using (XmlReader reader = XmlReader.Create(uri))
{
XElement name = null;
XElement item = null;

reader.MoveToContent();

// Parse the file, save header information when encountered, and yield the
// Item XElement objects as they are created.

// loop through Customer elements
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element
&& reader.Name == "Customer")
{
// move to Name element
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element &&
reader.Name == "Name")
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 92

{
name = XElement.ReadFrom(reader) as XElement;
break;
}
}

// loop through Item elements
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.EndElement)
break;
if (reader.NodeType == XmlNodeType.Element
&& reader.Name == "Item")
{
item = XElement.ReadFrom(reader) as XElement;
if (item != null)
{
XElement tempRoot = new XElement("Root",
new XElement(name)
);
tempRoot.Add(item);
yield return item;
}
}
}
}
}
}
}

static void Main(string[] args)
{
XStreamingElement root = new XStreamingElement("Root",
from el in StreamCustomerItem("Source.xml")
select new XElement("Item",
new XElement("Customer", (string)el.Parent.Element("Name")),
new XElement(el.Element("Key"))
)
);
root.Save("Test.xml");
Console.WriteLine(File.ReadAllText("Test.xml"));
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 93

}
VII.11.7 Lm th no :truy cp lung XML phn mnh vi thng tin cho tiu
.
i khi bn c c cc tp tin XML ln bt k, v vit ng dng ca bn du
vt b nh ca ng dng l c th d on trc c. Nu bn c gng ly mt cy
XML ln vi mt tp tin XML, b nh ca bn s c s dng t l kch c ca tp
tin c ngha l, qu nhiu. V vy, bn nn s dng mt k thut streaming, thay v k
thut theo chnh sch.
Mt ty chn khc l vit ng dng ca bn bng cch s dng XmlReader.
Tuy nhin, bn c th mun s dng LINQ truy vn cy XML. Nu nm trong trng
hp ny, bn c th vit ring ca bn ty chnh phng thc axis.
vit ring phng thc axis ca bn, bn vit mt nh s dng cc phng
php m XmlReader c nodes cho n khi t n mt trong nhng nodes trong
bn quan tm. Cc phng php sau gi ReadFrom, m c t XmlReader v bng
mt XML phn mnh. N sau tr v mi phn mnh thng qua sn lng tr v
phng php l lit k tu chnh phng thc axis ca bn. Sau bn c th vit truy
vn LINQ trn phng thc axis tu chnh ca bn
K thut Streaming c p dng tt nht trong tnh hung m bn cn x l
cc ngun ti liu ch mt ln, v bn c th x l cc yu t trong ti liu c th t. Truy
vn vn hnh mt tiu chun nht nh, chng hn nh OrderBy, lp li ngun ca mnh,
thu thp tt c cc d liu, phn loi n, v sau cui cng tr v mc u tin trong
dy. Lu rng nu bn s dng mt truy vn m nh iu hnh hin ra ngun trc khi
tr v mc u tin, bn s khng gi mt du vt b nh nh.
Cc phng php tip cn v d ny cng s l xem phn thng tin tiu ny,
lu cc thng tin tiu , v sau xy dng mt cy XML nh c cha c cc tiu
thng tin v cc chi tit m bn ang lit k. Cc phng thc axis sau tr v mi ny,
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 94

cy XML nh. Cc truy vn sau c quyn truy cp vo cc thng tin tiu cng nh
cc thng tin chi tit.
Phng php tip cn ny c mt du vt b nh nh. Tng chi tit XML phn
mnh nh l sinh ra, khng c tham chiu c gi li, trc phn mnh, v n c sn
tp hp rc. Lu rng k thut ny to ra nhiu cc i tng sng ngn trn heap.
V d sau cho thy lm th no trin khai thc hin v s dng mt phng
thc m ty chnh axis lung XML phn mnh t cc tp tin ch nh bi cc URI. y l
ty chnh axis c th bng vn bn rng n nh mt ti liu c Customer, Name, v cc
phn t, v rng nhng phn t s c b tr nh trong Source.xml ti liu trn. l
mt cch d dng nht trin khai thc hin. Mt chi tit mnh m vic trin khai thc
hin s c chun b phn tch c php cho mt ti liu khng hp l.

static IEnumerable<XElement> StreamCustomerItem(string uri)
{
using (XmlReader reader = XmlReader.Create(uri))
{
XElement name = null;
XElement item = null;

reader.MoveToContent();

// Parse the file, save header information when encountered, and yield the
// Item XElement objects as they are created.

// loop through Customer elements
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element
&& reader.Name == "Customer")
{
// move to Name element
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element &&
reader.Name == "Name")
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 95

{
name = XElement.ReadFrom(reader) as XElement;
break;
}
}

// loop through Item elements
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.EndElement)
break;
if (reader.NodeType == XmlNodeType.Element
&& reader.Name == "Item")
{
item = XElement.ReadFrom(reader) as XElement;
if (item != null) {
XElement tempRoot = new XElement("Root",
new XElement(name)
);
tempRoot.Add(item);
yield return item;
}
}
}
}
}
}
}

static void Main(string[] args)
{
XElement xmlTree = new XElement("Root",
from el in StreamCustomerItem("Source.xml")
where (int)el.Element("Key") >= 3 && (int)el.Element("Key") <= 7
select new XElement("Item",
new XElement("Customer", (string)el.Parent.Element("Name")),
new XElement(el.Element("Key"))
)
);
Console.WriteLine(xmlTree);
}
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 96


VII.12 So snh cc Xpath v LINQ to XML.
Xpath 1,0 a ra trng thi rng mt b su tp m l kt qu ca nh gi l mt
biu thc Xpath khng c khai bo.
Tuy nhin, khi lp li thng qua mt b su tp tr v bi mt LINQ to XML
Xpath phng thc axis, cc nodes trong b su tp ang c trong ti liu tr v trt t.
y l trng hp ngay c khi truy cp vo axis Xpath xc nhn, ni xc nhn c trong
n trong iu khon ca ti liu o ngc trt t, chng hn nh preceding and
preceding-sibling.
Ngc li, hu ht cc LINQ to XML axis tr v trong b su tp ti liu c th
t, nhng hai trong s chng, Ancestors v AncestorsAndSelf, tr v trong b su tp ti
liu th t o ngc. Bng sau lit k cc axis, v cho bit b su tp lnh cho mi th
t:
LINQ to XML axis Ordering
XContainer.DescendantNodes Document order
XContainer.Descendants Document order
XContainer.Elements Document order
XContainer.Nodes Document order
XContainer.NodesAfterSelf Document order
XContainer.NodesBeforeSelf Document order
XElement.AncestorsAndSelf Reverse document order
XElement.Attributes Document order
XElement.DescendantNodesAndSelf Document order
XElement.DescendantsAndSelf Document order
XNode.Ancestors Reverse document order
XNode.ElementsAfterSelf Document order
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 97

XNode.ElementsBeforeSelf Document order
XNode.NodesAfterSelf Document order
XNode.NodesBeforeSelf Document order


VIII. LINQ to Objects
Thut ng "LINQ to Objects" cp n vic s dng cc truy vn LINQ vi bt
k tp hp IEnumerable hay IEnumerable (T), m khng cn s dng mt nh cung cp
hay API nh LINQ to SQL hay LINQ to XML. Bn c th s dng LINQ truy vn bt
k b su tp enumerable nh: List (T), Array, hoc Dictionary (TKey, TValue). Cc tp
hp c th c ngi dng xc nh hoc c th c tr li bi mt. NET Framework
API.
Trong mt ngha c bn, LINQ to Objects i din cho mt phng php tip
cn mi ti tp hp. Trong cch c, bn phi vit vng lp foreach phc tp theo l
thuyt xc nh rng lm th no truy xut d liu t mt tp hp. Trong LINQ a ra
cch tip cn mi, bn vit m c tnh m t nhng g bn mun truy xut.
Ngoi ra, cc truy vn LINQ cung cp ba s tin li hn cc vng lp foreach truyn
thng:
1. Chng ngn gn v d c, c bit l khi c nhiu iu kin lc.
2. Chng cung cp b lc mnh m, sp xp, v kh nng gom nhm vi on m ng
dng nh nht.
3. Chng c th c chuyn n cc ngun d liu khc vi mt vi hoc khng c sa
i, b sung.
Nhn chung, cc hot ng phc tp hn m bn mun thc hin trn c s d
liu, cc bn s thy r hn li ch bng cch s dng LINQ thay v k thut lp truyn
thng.
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 98

VIII.1 Lm th no : Truy vn vi mt ArrayList LINQ
Khi s dng LINQ truy vn cc tp hp khng c c im chung IEnumerable
nh ArrayList, bn phi khai bo r rng kiu phm vi ca cc bin phn nh c th
ca cc loi i tng trong tp hp. V d, nu bn c mt ArrayList ca cc i tng
Student , mnh from ca bn nn trng nh th ny:
// C#
var query = from Student s in arrList
V d sau cho thy mt truy vn n gin trn mt ArrayList. Lu rng v d
ny khi chy khi on code gi phng thc Add, nhng iu ny khng phi l mt
yu cu.
using System;
using System.Collections;
using System.Linq;

namespace NonGenericLINQ
{
public class Student
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int[] Scores { get; set; }
}

class Program
{
static void Main(string[] args)
{
ArrayList arrList = new ArrayList();
arrList.Add(
new Student
{
FirstName = "Svetlana", LastName = "Omelchenko",
Scores = new int[] { 98, 92, 81, 60 }
});
arrList.Add(
new Student
{
FirstName = "Claire", LastName = "ODonnell", Scores
= new int[] { 75, 84, 91, 39 }
});
arrList.Add(
new Student
{
FirstName = "Sven", LastName = "Mortensen", Scores =
new int[] { 88, 94, 65, 91 }
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 99

});
arrList.Add(
new Student
{
FirstName = "Cesar", LastName = "Garcia", Scores =
new int[] { 97, 89, 85, 82 }
});

var query = from Student student in arrList
where student.Scores[0] > 95
select student;

foreach (Student s in query)
Console.WriteLine(s.LastName + ": " + s.Scores[0]);

// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
}

VIII.2 LINQ and Strings
LINQ c th c s dng truy vn v bin i nhng chi v tp tp ca
nhng chui. N c bit hu ch vi cu trc d liu trong file vn bn. Cc truy vn
LINQ c th c kt hp vi cc hm v cc biu thc ca chui bnh thng. V d,
bn c th s dng cc phng thc Split to ra mt mng ca nhng chui m bn c
th truy vn sau hoc sa i bng cch s dng LINQ. Bn c th s dng cc
phng thc IsMatch trong mnh where ca mt truy vn LINQ. V bn c th s
dng LINQ truy vn hoc sa i MatchCollection cc kt qu tr li bi mt biu
thc chnh quy.
VIII.3 Lm th no : m s xut hin ca mt t trong mt chui (LINQ)
V d ny cho thy cch s dng mt truy vn LINQ m cc xut hin ca
mt t trong mt chui. Lu rng thc hin vic m, trc tin l gi phng thc
Split to ra mt mng cc t. y l mt chi ph cho s thc thi phng thc Split.
Nu ch thao tc trn cc chui l m cc t, bn nn cn nhc vic s dng cc
phng thc Matches hoc IndexOf ph hp thay th. Tuy nhin, nu chi ph khng
phi l mt vn nghim trng, hoc bn phn chia cc cu thc hin cc loi truy
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 100

vn trn n, th n lm cho cm gic s dng LINQ truy cp cc t hoc cm t cng
nh.
class CountWords
{
static void Main()
{
string text = @"Historically, the world of data and the world of
objects" +
@" have not been well integrated. Programmers work in C# or Visual
Basic" +
@" and also in SQL or XQuery. On the one side are concepts such as
classes," +
@" objects, fields, inheritance, and .NET Framework APIs. On the
other side" +
@" are tables, columns, rows, nodes, and separate languages for
dealing with" +
@" them. Data types often require translation between the two
worlds; there are" +
@" different standard functions. Because the object world has no
notion of query, a" +
@" query can only be represented as a string without compile-time
type checking or" +
@" IntelliSense support in the IDE. Transferring data from SQL
tables or XML trees to" +
@" objects in memory is often tedious and error-prone.";

string searchTerm = "data";

//Convert the string into an array of words
string[] source = text.Split(new char[] { '.', '?', '!', ' ', ';',
':', ',' }, StringSplitOptions.RemoveEmptyEntries);

// Create and execute the query. It executes immediately
// because a singleton value is produced.
// Use ToLowerInvariant to match "data" and "Data"
var matchQuery = from word in source
where word.ToLowerInvariant() ==
searchTerm.ToLowerInvariant()
select word;

// Count the matches.
int wordCount = matchQuery.Count();
Console.WriteLine("{0} occurrences(s) of the search term \"{1}\" were
found.", wordCount, searchTerm);

// Keep console window open in debug mode
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
}
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 101

VIII.4 Lm th no : Truy vn cho cu cha mt b t.
V d ny cho thy nh th no tm cu trong mt tp tin vn bn c cha kt
qu ph hp cho mi mt b t. Mc d cc iu kin tm kim l mt on code cng
trong v d ny, n cng c th c ly ra ti thi gian chy. Trong v d ny, cc truy
vn s tr v cc cu c cha cc cm t "Historically", "data," v "integrated"
class FindSentences
{
static void Main()
{
string text = @"Historically, the world of data and the world of
objects " +
@"have not been well integrated. Programmers work in C# or Visual
Basic " +
@"and also in SQL or XQuery. On the one side are concepts such as
classes, " +
@"objects, fields, inheritance, and .NET Framework APIs. On the other
side " +
@"are tables, columns, rows, nodes, and separate languages for
dealing with " +
@"them. Data types often require translation between the two worlds;
there are " +
@"different standard functions. Because the object world has no
notion of query, a " +
@"query can only be represented as a string without compile-time type
checking or " +
@"IntelliSense support in the IDE. Transferring data from SQL tables
or XML trees to " +
@"objects in memory is often tedious and error-prone.";

// Split the text block into an array of sentences.
string[] sentences = text.Split(new char[] { '.', '?', '!' });

// Define the search terms. This list could also be dynamically
populated at runtime.
string[] wordsToMatch = { "Historically", "data", "integrated" };

// Find sentences that contain all the terms in the wordsToMatch
array.
// Note that the number of terms to match is not specified at compile
time.
var sentenceQuery = from sentence in sentences
let w = sentence.Split(new char[] { '.', '?',
'!', ' ', ';', ':', ',' },

StringSplitOptions.RemoveEmptyEntries)
where
w.Distinct().Intersect(wordsToMatch).Count() == wordsToMatch.Count()
select sentence;

n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 102

// Execute the query. Note that you can explicitly type
// the iteration variable here even though sentenceQuery
// was implicitly typed.
foreach (string str in sentenceQuery)
{
Console.WriteLine(str);
}

// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
}

Cc truy vn lm vic bng cch trc tin phn i vn bn vo cu, v sau
tch cc cu vo mt mng c cha nhng chui ca mi t. i vi mi arrays ny,
phng thc Distinct loi b tt c cc k t no b trng lp, v sau truy vn thc hin
cc hot ng trn mt phn ct t mng v cc mng wordsToMatch. Nu vic m cc
im giao l ging nh m ca mng wordsToMatch, tt c cc t c tm thy
trong t v ban u l cu tr v.
Trong lc gi n Split, cc du chm cu nh du tch c s dng loi b
chng khi chui. Nu bn khng lm c iu ny, v d nh bn c th c mt
chui "Historically," rng s khng ph hp vi "Historically" trong mng
wordsToMatch. Bn c th s dng c thm cc du tch, ty thuc vo loi du chm
cu c tm thy trong cc ngun vn bn.
VIII.5 Lm th no : Truy vn cho cc k t trong mt String (LINQ)
Bi v trong thc hin cc lp String c chung interface IEnumerable (T), bt k
chui c th c truy vn nh l mt chui cc k t. Tuy nhin, iu ny khng phi l
mt cch s dng chung ca LINQ.
V d sau truy vn mt chui xc nh s lng s ch s cha trong n. Lu
rng cc truy vn l "reused" sau khi c thc hin ln u tin. iu ny c th v cc
truy vn t n khng lu tr bt k kt qu thc s.
class QueryAString
{
static void Main()
{
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 103

string aString = "ABCDE99F-J74-12-89A";

// Select only those characters that are numbers
IEnumerable<char> stringQuery =
from ch in aString
where Char.IsDigit(ch)
select ch;

// Execute the query
foreach (char c in stringQuery)
Console.Write(c + " ");

// Call the Count method on the existing query.
int count = stringQuery.Count();
Console.WriteLine("Count = {0}", count);

// Select all characters before the first '-'
IEnumerable<char> stringQuery2 = aString.TakeWhile(c => c != '-');

// Execute the second query
foreach (char c in stringQuery2)
Console.Write(c);

Console.WriteLine(System.Environment.NewLine + "Press any key to exit");
Console.ReadKey();

}
}

VIII.6 Lm th no : Kt hp LINQ truy vn vi cc biu thc chnh quy.
V d ny cho thy cch s dng lp Regex to ra mt biu thc chnh quy cho
ph hp hn trong chui vn bn. Cc truy vn LINQ l cch d dng lc chnh xc v
cc tp tin m bn mun tm kim vi cc biu thc chnh quy, v hnh thnh cc kt
qu.
class QueryWithRegEx
{
public static void Main()
{
string startFolder = @"c:\program files\Microsoft Visual Studio 9.0\";

IEnumerable<System.IO.FileInfo> fileList = GetFiles(startFolder);
System.Text.RegularExpressions.Regex searchTerm =
new System.Text.RegularExpressions.Regex(@"Visual
(Basic|C#|C\+\+|J#|SourceSafe|Studio)");
var queryMatchingFiles =
from file in fileList
where file.Extension == ".htm"
let fileText = System.IO.File.ReadAllText(file.FullName)
let matches = searchTerm.Matches(fileText)
where searchTerm.Matches(fileText).Count > 0
select new
{
name = file.FullName,
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 104

matches = from System.Text.RegularExpressions.Match match in matches
select match.Value
};

// Execute the query.
Console.WriteLine("The term \"{0}\" was found in:", searchTerm.ToString());


foreach (var v in queryMatchingFiles)
{ string s = v.name.Substring(startFolder.Length - 1);
Console.WriteLine(s);

// For this file, write out all the matching strings
foreach (var v2 in v.matches)
{
Console.WriteLine(" " + v2);
}
}
Console.WriteLine("Press any key to exit");
Console.ReadKey();
} static IEnumerable<System.IO.FileInfo> GetFiles(string path)
{
if (!System.IO.Directory.Exists(path))
throw new System.IO.DirectoryNotFoundException();

string[] fileNames = null;
List<System.IO.FileInfo> files = new List<System.IO.FileInfo>();

fileNames = System.IO.Directory.GetFiles(path, "*.*",
System.IO.SearchOption.AllDirectories);
foreach (string name in fileNames)
{
files.Add(new System.IO.FileInfo(name));
}
return files;
}
}
Lu rng bn cng c th truy vn i tng MatchCollection c tr li bi
mt RegEx tm kim. Trong v d ny ch c gi tr ca mi tng xng l c tr v
trong cc kt qu. Tuy nhin, y cng l c th s dng LINQ thc hin tt c cc
loi lc, phn loi, v cc nhm trn tp hp. Bi v MatchCollection l mt tp hp
khng c kiu chung IEnumerable, bn cn phi r rng trng ti trong phm vi ca cc
loi bin trong truy vn.
VIII.7 Cu hi bn cu trc d liu nh dng vn bn
Nhiu loi khc nhau ca cc file vn bn bao gm mt lot cc dng, thng
xuyn vi cc nh dng tng t, chng hn nh tab hay du phy phn cc tp tin hoc
c nh-chiu di dng. Sau khi bn c nh mt tp tin vn bn vo b nh, bn c th
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 105

s dng LINQ truy vn v / hoc sa i dng. Cc truy vn LINQ cng n gin ha
cc nhim v, kt hp d liu t nhiu ngun
VIII.7.1 Lm th no : Tm cc tp khc bit gia hai danh sch (LINQ)
V d ny cho thy nh th no s dng LINQ so snh hai danh sch ca
nhng chui v nhng dng c trong names1.txt nhng khng c trong names2.txt.
class CompareLists
{
static void Main()
{
// Create the IEnumerable data sources.
string[] names1 = System.IO.File.ReadAllLines(@"../../../names1.txt");
string[] names2 = System.IO.File.ReadAllLines(@"../../../names2.txt");

// Create the query. Note that method syntax must be used here.
IEnumerable<string> differenceQuery =
names1.Except(names2);

// Execute the query.
Console.WriteLine("The following lines are in names1.txt but not names2.txt");
foreach (string s in differenceQuery)
Console.WriteLine(s);

// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
}
VIII.7.2 Lm th no : Sp xp hay Lc d liu Vn bn bi bt k mt t hoc
mt trng (LINQ)
V d sau cho thy lm th no phn loi cu trc ca dng vn bn, chng hn
nh gi tr phn cch bng du phy, bi bt k trng no trong dng. Cc trng c th
c xc nh theo kiu ng ti thi gian chy. Gi nh rng cc trng trong
scores.csv ca sinh vin i din cho mt s ID, tip theo l mt lot cc bi kim tra bn
im s.
public class SortLines
{
static void Main()
{
// Create an IEnumerable data source
string[] scores = System.IO.File.ReadAllLines(@"../../../scores.csv");

// Change this to any value from 0 to 4.
int sortField = 1;

Console.WriteLine("Sorted highest to lowest by field [{0}]:", sortField);

n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 106

// Demonstrates how to return query from a method.
// The query is executed here.
foreach (string str in RunQuery(scores, sortField))
{
Console.WriteLine(str);
}

// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}

// Returns the query variable, not query results!
static IEnumerable<string> RunQuery(IEnumerable<string> source, int num)
{
// Split the string and sort on field[num]
var scoreQuery = from line in source
let fields = line.Split(',')
orderby fields[num] descending
select line;

return scoreQuery;
}
}

VIII.7.3 Lm th no : Sp xp li cc trng c nh gii trong file.
Mt gi tr phn cch bng du phy (CSV) file l mt tp tin vn bn n thng
c s dng lu tr d liu bng tnh hay xp nh bng cc d liu c i din bi
cc hng v ct. Bng vic s dng phng thc Split phn cch cc lnh vc, n l
rt d dng truy vn v thao tc cc file bng cch s dng LINQ. Trong thc t, cng
mt k thut c th c s dng sp xp li phn no cu trc ca dng vn bn; n
khng phi l gii hn i vi cc tp tin CSV.
Trong v d sau, gi nh rng ba ct i din ca hc sinh "last name", "first
name", v "ID. Cc trng ang c theo th t ch ci da trn tn ca mi hc sinh.
Cc truy vn to ra mt dy mi, trong cc ct ID xut hin trc, theo sau l mt ct
th hai l kt hp hai phn last name v first name ca hc sinh. Nhng dng c
sp xp theo ID. Cc kt qu c lu vo mt tp tin mi v cc d liu ban u l
khng sa i.
VIII.8 to cc tp d liu
To mi mt d nVisual C# v sao chp nhng dng ny vo mt tp tin vn bn
gc m c tn spreadsheet1.csv. Lu tp tin trong th mc gii php ca bn.
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 107


class CSVFiles
{
static void Main(string[] args)
{
// Create the IEnumerable data source
string[] lines = System.IO.File.ReadAllLines(@"../../../spreadsheet1.csv");

// Create the query. Put field 2 first, then
// reverse and combine fields 0 and 1 from the old field
IEnumerable<string> query =
from line in lines
let x = line.Split(',')
orderby x[2]
select x[2] + ", " + (x[1] + " " + x[0]);

// Execute the query and write out the new file. Note that WriteAllLines
// takes a string[], so ToArray is called on the query.
System.IO.File.WriteAllLines(@"../../../spreadsheet2.csv", query.ToArray());

Console.WriteLine("Spreadsheet2.csv written to disk. Press any key to exit");
Console.ReadKey();
}
}
VIII.8.1 Lm th no : Kt hp v so snh cc tp hp chui (LINQ)
V d ny cho thy nh th no trn file c cha dng vn bn v sau phn
loi cc kt qu. C th, n cho thy nh th no thc hin mt cch d dng ghp,
hp trn hai b dng vn bn.
class MergeStrings
{
static void Main(string[] args)
{
//Put text files in your solution folder
string[] fileA =
System.IO.File.ReadAllLines(@"../../../names1.txt");
string[] fileB =
System.IO.File.ReadAllLines(@"../../../names2.txt");

//Simple concatenation and sort. Duplicates are preserved.
IEnumerable<string> concatQuery =
fileA.Concat(fileB).OrderBy(s => s);

// Pass the query variable to another function for execution.
OutputQueryResults(concatQuery, "Simple concatenate and sort.
Duplicates are preserved:");

// Concatenate and remove duplicate names based on
// default string comparer.
IEnumerable<string> uniqueNamesQuery =
fileA.Union(fileB).OrderBy(s => s);
OutputQueryResults(uniqueNamesQuery, "Union removes duplicate
names:");
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 108


// Find the names that occur in both files (based on
// default string comparer).
IEnumerable<string> commonNamesQuery =
fileA.Intersect(fileB);
OutputQueryResults(commonNamesQuery, "Merge based on
intersect:");

// Find the matching fields in each list. Merge the two
// results by using Concat, and then
// sort using the default string comparer.
string nameMatch = "Garcia";

IEnumerable<String> tempQuery1 =
from name in fileA
let n = name.Split(',')
where n[0] == nameMatch
select name;

IEnumerable<string> tempQuery2 =
from name2 in fileB
let n2 = name2.Split(',')
where n2[0] == nameMatch
select name2;

IEnumerable<string> nameMatchQuery =
tempQuery1.Concat(tempQuery2).OrderBy(s => s);
OutputQueryResults(nameMatchQuery, String.Format("Concat based on
partial name match \"{0}\":", nameMatch));

// Keep the console window open in debug mode.
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}

static void OutputQueryResults(IEnumerable<string> query, string
message)
{
Console.WriteLine(System.Environment.NewLine + message);
foreach (string item in query)
{
Console.WriteLine(item);
}
Console.WriteLine("{0} total names in list", query.Count());
}
}


VIII.8.2 Lm th no : Ly ra tp hp i tng t nhiu ngun (LINQ)
V d ny cho thy nh th no trn d liu t cc loi ngun khc nhau vo
mt chui cc loi mi. Cc v d trong cc m sau y s trn cc chui vi nhng
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 109

mng s nguyn. Tuy nhin, trong cng mt nguyn tc p dng cho bt k hai ngun d
liu, bao gm c bt k s kt hp ca cc i tng trong b nh.
V d: V d sau cho thy cch s dng mt tn kiu Student lu tr d liu t hai b
nh trong tp hp ca nhng chui m m phng d liu trong bng tnh. Trc tin tp
hp ca cc chui miu t cc tn v ID, v tip theo tp hp miu t ID ca hc
sinh(trong ct u tin).
class Student
{
public string FirstName { get; set; }
public string LastName { get; set; }
public int ID { get; set; }
public List<int> ExamScores { get; set; }
}

class PopulateCollections
{
static void Main()
{
Dissimilar Files (LINQ)
string[] names = System.IO.File.ReadAllLines(@"../../../names.csv");
string[] scores =
System.IO.File.ReadAllLines(@"../../../scores.csv");
IEnumerable<Student> queryNamesScores =
from name in names
let x = name.Split(',')
from score in scores
let s = score.Split(',')
where x[2] == s[0]
select new Student()
{
FirstName = x[0],
LastName = x[1],
ID = Convert.ToInt32(x[2]),
ExamScores = (from scoreAsText in s.Skip(1)
select Convert.ToInt32(scoreAsText)).
ToList()
};

List<Student> students = queryNamesScores.ToList();
foreach (var student in students)
{
Console.WriteLine("The average score of {0} {1} is {2}.",
student.FirstName, student.LastName,
student.ExamScores.Average());
}

//Keep console window open in debug mode
Console.WriteLine("Press any key to exit.");
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 110

Console.ReadKey();
}
}

VIII.8.3 Lm th no : Gia nhp ni dung t cc file khng cng dng.
V d ny cho thy nh th no tham gia d liu t hai du phy phn chia tp
tin rng mt trong cc gi tr c s dng nh mt cha kha ph hp. K thut ny c
th l hu ch nu bn c kt hp d liu t hai bng tnh, hay d liu t mt bng tnh v
mt tp tin c nh dng khc, vo mt tp tin mi. Bn cng c th sa i v d ny
lm vic vi bt k hnh thc no v cu trc vn bn.
class JoinStrings
{
static void Main()
{

string[] names = System.IO.File.ReadAllLines(@"../../../names.csv");
string[] scores = System.IO.File.ReadAllLines(@"../../../scores.csv");
IEnumerable<string> scoreQuery1 =
from name in names
let nameFields = name.Split(',')
from id in scores
let scoreFields = id.Split(',')
where nameFields[2] == scoreFields[0]
select nameFields[0] + "," + scoreFields[1] + "," + scoreFields[2]
+ "," + scoreFields[3] + "," + scoreFields[4];
OutputQueryResults(scoreQuery1, "Merge two spreadsheets:");
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}

static void OutputQueryResults(IEnumerable<string> query, string message)
{
Console.WriteLine(System.Environment.NewLine + message);
foreach (string item in query)
{
Console.WriteLine(item);
}
Console.WriteLine("{0} total names in list", query.Count());
}
}
VIII.8.4 Lm th no : Tch mt file vo cc file bng cch s dng cc nhm
(LINQ)
V d sau cho thy cng vic .
class SplitWithGroups
{
static void Main()
{
string[] fileA = System.IO.File.ReadAllLines(@"../../../names1.txt");
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 111

string[] fileB = System.IO.File.ReadAllLines(@"../../../names2.txt");
var mergeQuery = fileA.Union(fileB);.
var groupQuery = from name in mergeQuery
let n = name.Split(',')
group name by n[0][0] into g
orderby g.Key
select g;
foreach (var g in groupQuery)
{
// Create the new file name.
string fileName = @"../../../testFile_" + g.Key + ".txt";

// Output to display.
Console.WriteLine(g.Key);

// Write file.
using (System.IO.StreamWriter sw = new System.IO.StreamWriter(fileName))
{
foreach (var item in g)
{
sw.WriteLine(item);
// Output to console for example purposes.
Console.WriteLine(" {0}", item);
}
}
}
// Keep console window open in debug mode.
Console.WriteLine("Files have been written. Press any key to exit");
Console.ReadKey();
}
}
VIII.8.5 Lm th no : Tnh ton gi tr ca ct trong mt vn bn ca tp CSV
(LINQ)
V d ny cho thy nh th no thc hin tng hp thao tc tnh ton nh Sum,
Average, Min, Max v trn cc ct ca mt file. Csv. V d nguyn tc c hin th
y c th c p dng cho cc loi cu trc vn bn.
class SumColumns
{
static void Main(string[] args)
{
string[] lines = System.IO.File.ReadAllLines(@"../../../scores.csv");
int exam = 3;
SingleColumn(lines, exam + 1);
Console.WriteLine();
MultiColumns(lines);

Console.WriteLine("Press any key to exit");
Console.ReadKey();
}

static void SingleColumn(IEnumerable<string> strs, int examNum)
{
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 112

Console.WriteLine("Single Column Query:");
var columnQuery =
from line in strs
let x = line.Split(',')
select Convert.ToInt32(x[examNum]);
var results = columnQuery.ToList();

// Perform aggregate calculations
// on the column specified by examNum.
double average = results.Average();
int max = results.Max();
int min = results.Min();

Console.WriteLine("Exam #{0}: Average:{1:##.##} High Score:{2} Low
Score:{3}",
examNum, average, max, min);
}
static void MultiColumns(IEnumerable<string> strs)
{
Console.WriteLine("Multi Column Query:");

IEnumerable<IEnumerable<int>> query =
from line in strs
let x = line.Split(',')
let y = x.Skip(1)
select (from str in y
select Convert.ToInt32(str));

// Execute and cache the results for performance.
// ToArray could also be used here.
var results = query.ToList();

// Find out how many columns we have.
int columnCount = results[0].Count();
for (int column = 0; column < columnCount; column++)
{
var res2 = from row in results
select row.ElementAt(column);
double average = res2.Average();
int max = res2.Max();
int min = res2.Min();

// 1 is added to column because Exam numbers
// begin with 1
Console.WriteLine("Exam #{0} Average: {1:##.##} High Score: {2}
Low Score: {3}",
column + 1, average, max, min);
}
}
}

n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 113

IX. LINQ to ADO.NET
Ngn ng tch hp truy vn (LINQ) nh ngha mt tp cc ton t truy vn chun
bn c th s dng trong ngn ng lp trnh trn nn .NET Framework 3.0. Cc ton t
truy vn chun cho php bn vn hnh d n, lc, v i ngang b nh trong tp hp hoc
mt c s d liu trong bng. Lu rng cc truy vn LINQ c th hin trong ngn
ng lp trnh ring ca mnh, v khng nh chui k t nhng vo on m ng dng.
y l mt thay i ng k t cc ng dng c vit trn cc phin bn c ca
.NET Framework. Vit truy vn t bn trong ngn ng lp trnh ca bn cung cp mt
vi li th ch cht. N n gin bng cch loi b cc truy vn cn phi s dng mt
ngn ng truy vn ring bit. V nu bn s dng IDE Visual Studio 2008 , LINQ cng
cho php bn tn dng li th ca qu trnh kim tra ti thi gian bin dch, loi tnh, v
trnh h tr thng minh.
LINQ c tch hp vo nhiu kha cnh khc nhau ca vic truy cp d liu
trong .NET Framework, bao gm c vic ngt kt ni DataSet vi m hnh lp trnh v
hin ti gin c s d liu SQL Server. Phn ny m t trong LINQ to ADO.NET.
Di y l m hnh cung cp tng quan ca LINQ to ADO.NET lm vic nh th
no lin quan n ngn ng lp trnh cao cp , cc cng ngh LINQ, v cc d liu ngn
m LINQ lm vic.
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 114


X. LINQ to DataSet
LINQ to DataSet lm cho n d dng hn v nhanh hn truy vn trn d liu
lu tr trong mt i tng DataSet. C th, LINQ to DataSet lm n gin ha cu truy
vn bng cch cho php cc ngi pht trin vit cc truy vn t cc ngn ng lp trnh,
thay v s dng mt ngn ng truy vn ring bit. iu ny c bit hu ch cho nhng
ngi pht trin s dng Visual Studio, nhng ngi by gi c th tn dng li th ca
thi gian bin dch c php kim tra, cc kiu tnh, v trnh h tr cung cp bi Visual
Studio trong truy vn ca h.
LINQ to DataSet cng c th c s dng truy vn trn d liu c hp
nht t mt hoc nhiu ngun d liu. iu ny cho php mt vi kch bn c yu cu
tnh linh hot trong cch miu t cho d liu v x l, nh l cu truy vn cc b tp hp
li d liu v gia tng b nh m trong ng dng web. c bit, bo co chung chung,
phn tch, cc giao dch thng minh cc ng dng ny yu cu phng thc ny c
thao tc bng tay.
Cc hm chc nng LINQ to DataSet l thng qua cc phng phng thc m
rng trong cc lp DataRowExtensions v DataTableExtensions. LINQ to DataSet xy
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 115

dng v s dng sn c trn kin trc ADO.NET 2.0, v khng n c ngha l thay
th ADO.NET 2.0 trong m ng dng. Hin nay ADO.NET 2.0 m ny s tip tc chc
nng trong mt ng dng LINQ to DataSet. Mi quan h ca LINQ to DataSet ti
ADO.NET 2.0 v cc d liu lu tr c minh ha trong s sau y.

X.1 Tng quan v LINQ to DataSet.
The DataSet l mt trong nhng chi tit c s dng rng ri cc thnh phn ca
ADO.NET. l mt yu t ch cht ca cc chng trnh tch ri da trn ADO.NET,
v n cho php bn cache d liu t cc ngun d liu khc nhau. tng trnh din, cc
DataSet c tch hp cht ch vi GUI kim sot cho cc lin kt d liu. i vi cc
tng trung gian, n cung cp mt b nh cache duy tr cc quan h hnh dng ca d liu,
bao gm cc truy vn nhanh chng n gin v h ng cp hng dch v. Mt k thut
chung c s dng gim s lng cc yu cu trn mt c s d liu l s dng
DataSet cho b nh m tng gia. V d, lu n mt iu khin d liu ng dng
web ASP.NET . Thng thng, mt phn quan trng ca cc ng dng d liu, khng c
thay i thng xuyn v l xuyn sut mt phin lm vic hoc ngi s dng. D liu
ny c th c gi trong b nh trn Web Server, m lm gim s lng cc yu cu
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 116

i vi c s d liu v y mnh tng tc ca ngi dng. Mt kha cnh hu ch ca
DataSet l n cho php mt ng dng lm cho tp con ca d liu t mt hoc nhiu
ngun d liu vo khng gian ng dng . Cc ng dng sau c th thao tc cc d liu
trong b nh, trong khi duy tr cc mi quan h ca n.
Mc d mt lot cc s nh ln, DataSet hn ch kh nng truy vn. Chn cc
phng thc c th c s dng lc v phn loi, v cc phng thc GetChildRows
v GetParentRow c th c s dng cho s iu hng h ng cp. i vi bt c
iu g phc tp hn, tuy nhin, nhng ngi pht trin phi vit mt truy vn tu chnh.
iu ny c th kt qu trong cc ng dng c hiu sut km v rt kh duy tr.
LINQ to DataSet lm cho n d dng hn v nhanh hn truy vn d liu lu tr
trong mt i tng DataSet. Cc truy vn ny c th hin trong chnh ngn ng lp
trnh, ch khng phi l nh chui ch nhng vo m ng dng. iu ny c ngha l cc
ngi pht trin khng tm hiu mt ngn ng truy vn ring bit. Ngoi ra, LINQ to
DataSet cho php nh pht trin Visual Studio lm vic c hiu qu hn, bi v Visual
Studio IDE cung cp c php kim tra thi gian bin dch, cc kiu tnh, v trnh h tr
thng minh h tr cho LINQ. LINQ to DataSet cng c th c s dng truy vn trn
d liu c hp nht t mt hoc nhiu ngun d liu. iu ny cho php mt vi
kch bn c yu cu tnh linh hot trong cch miu t cho d liu v x l, nh l cu truy
vn cc b tp hp li d liu v gia tng b nh m trong ng dng web. c bit,
bo co chung chung, phn tch, cc giao dch thng minh cc ng dng ny yu cu
phng thc ny c thao tc bng tay.
X.2 Truy vn cc DataSet s dng LINQ DataSet
Trc khi bn c th bt u truy vn mt i tng DataSet bng cch s dng
LINQ to DataSet, bn cn phi ti d liu ln DataSet. C mt s cch ti d liu vo
mt DataSet, chng hn nh bng cch s dng lp DataAdapter hay LINQ to SQL. Sau
khi d liu c ti vo mt i tng DataSet, bn c th bt u truy vn n. Hnh
thnh cc truy vn bng cch s dng LINQ to DataSet l tng t bng cch s dng
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 117

ngn ng truy vn tch hp (LINQ) da trn cc d liu ngun m LINQ cho php. Cc
truy vn LINQ c th c thc hin i vi mt bng trong mt DataSet hay da trn
nhiu hn mt bng bng cch s dng Join v GroupJoin vn hnh theo hot ng truy
vn chun.
Truy vn LINQ c h tr i vi c hai typed and cc i tng untyped
DataSet. Nu gin ca DataSet c bit n ti thi gian thit k ng dng, mt kiu
DataSet l mt ph thc. Trong mt kiu DataSet, cc bng v hng kiu thnh vin cho
mi ct, n lm cho cc truy vn n gin hn v d c hn.
Ngoi ra cc ton t truy vn chun c trin khai thc hin trong th vin
System.Core.dll, LINQ to DataSet cho bit thm mt vi DataSet-c th m rng lm
cho n d dng hn truy vn trn mt tp cc i tng DataRow. Nhng DataSet-c
th m rng bao gm cc ton t cho so snh trnh t ca cc hng, cng nh cc
phng thc l cung cp truy cp n cc ct gi tr ca mt DataRow.
X.3 ng dng N-tier v LINQ to DataSet
Cc ng dng d liu N-tier c trung tm d liu ca ng dng c tch ra thnh
nhiu lp logic (hoc cp). Mt in hnh ca ng dng N-tier bao gm mt tng trnh
din, mt tng trung chuyn d liu, v mt tng d liu(M hnh tam tng). Tch ng
dng thnh cc cu kin vo cc tng ring bit lm tng ln c th duy tr c v quy
m ca ng dng.
Trong cc ng dng N-tier , cc DataSet thng c s dng trong tng trung
gian cache cc thng tin cho mt ng dng web.Truy vn LINQ to DataSet thc hin
chc nng thng qua cc phng thc m rng v m rng hin c ca ADO.NET 2.0
DataSet.
Di y l nhng s hin th nh th no LINQ to DataSet lin quan n cc
DataSet v fits vo mt ng dng N-tier:
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 118


X.4 ang ti d liu vo mt DataSet
Mt i tng DataSet trc tin phi c d liu ln trc khi bn c th
truy vn trn n vi LINQ to DataSet. C nhiu cch khc nhau d liu ln
DataSet. V d, bn c th s dng LINQ to SQL truy vn c s d liu v ti cc kt
qu vo DataSet.
Thm mt cch no np d liu vo mt DataSet l s dng nhng lp
DataAdapter, ly cc d liu t c s d liu. y l minh ha trong v d sau.
try
{
// Create a new adapter and give it a query to fetch sales order, contact,
// address, and product information for sales in the year 2002. Point connection
// information to the configuration setting "AdventureWorks".
string connectionString = "Data Source=localhost;Initial Catalog=AdventureWorks;"
+ "Integrated Security=true;";
SqlDataAdapter da = new SqlDataAdapter(
"SELECT SalesOrderID, ContactID, OrderDate, OnlineOrderFlag, " +
"TotalDue, SalesOrderNumber, Status, ShipToAddressID, BillToAddressID " +
"FROM Sales.SalesOrderHeader " +
"WHERE DATEPART(YEAR, OrderDate) = @year; " +

"SELECT d.SalesOrderID, d.SalesOrderDetailID, d.OrderQty, " +
"d.ProductID, d.UnitPrice " +
"FROM Sales.SalesOrderDetail d " +
"INNER JOIN Sales.SalesOrderHeader h " +
"ON d.SalesOrderID = h.SalesOrderID " +
"WHERE DATEPART(YEAR, OrderDate) = @year; " +

"SELECT p.ProductID, p.Name, p.ProductNumber, p.MakeFlag, " +
"p.Color, p.ListPrice, p.Size, p.Class, p.Style, p.Weight " +
"FROM Production.Product p; " +

"SELECT DISTINCT a.AddressID, a.AddressLine1, a.AddressLine2, " +
"a.City, a.StateProvinceID, a.PostalCode " +
"FROM Person.Address a " +
"INNER JOIN Sales.SalesOrderHeader h " +
"ON a.AddressID = h.ShipToAddressID OR a.AddressID = h.BillToAddressID " +
"WHERE DATEPART(YEAR, OrderDate) = @year; " +

"SELECT DISTINCT c.ContactID, c.Title, c.FirstName, " +
"c.LastName, c.EmailAddress, c.Phone " +
"FROM Person.Contact c " +
"INNER JOIN Sales.SalesOrderHeader h " +
"ON c.ContactID = h.ContactID " +
"WHERE DATEPART(YEAR, OrderDate) = @year;",
connectionString);

n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 119

// Add table mappings.
da.SelectCommand.Parameters.AddWithValue("@year", 2002);
da.TableMappings.Add("Table", "SalesOrderHeader");
da.TableMappings.Add("Table1", "SalesOrderDetail");
da.TableMappings.Add("Table2", "Product");
da.TableMappings.Add("Table3", "Address");
da.TableMappings.Add("Table4", "Contact");

// Fill the DataSet.
da.Fill(ds);

// Add data relations.
DataTable orderHeader = ds.Tables["SalesOrderHeader"];
DataTable orderDetail = ds.Tables["SalesOrderDetail"];
DataRelation order = new DataRelation("SalesOrderHeaderDetail",
orderHeader.Columns["SalesOrderID"],
orderDetail.Columns["SalesOrderID"], true);
ds.Relations.Add(order);

DataTable contact = ds.Tables["Contact"];
DataTable orderHeader2 = ds.Tables["SalesOrderHeader"];
DataRelation orderContact = new DataRelation("SalesOrderContact",
contact.Columns["ContactID"],
orderHeader2.Columns["ContactID"], true);
ds.Relations.Add(orderContact);
}
catch (SqlException ex)
{
Console.WriteLine("SQL exception occurred: " + ex.Message);
}
X.5 Truy vn cc DataSet
Sau khi mt i tng DataSet c d liu ln, bn c th bt u truy vn
trn n. a vo mt cu truy vn LINQ truy vn vi DataSet l tng t bng cch
s dng LINQ da trn cc d liu ngn m LINQ cho php. Hy nh rng, tuy nhin,
khi bn s dng LINQ truy vn trong mt i tng DataSet bn l mt cu hi s lit k
ca cc i tng DataRow , thay v mt s lit k ca mt loi ty thch. iu ny c
ngha l bn c th s dng bt k ca cc thnh vin lp DataRow trong truy vn LINQ
ca bn . iu ny cho php bn to ra cc truy vn phong ph v phc tp.
Nh vi cc s trin khai ca LINQ, bn c th to cc truy vn LINQ to DataSet
trong hai hnh thc khc nhau: c php biu thc truy vn v c php truy vn da trn
phng thc. Bn c th s dng c php biu thc truy vn hoc c php truy vn da
trn phng thc thc hin cc truy vn trn cng mt bng trong mt DataSet, da
trn nhiu bng trong mt DataSet, hay da trn trong mt bng kiu DataSet.
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 120

X.6 truy vn trong LINQ to DataSet.
Mt truy vn l mt biu thc ly ra d liu t mt ngun d liu. Truy vn
thng c th hin r rng trong mt ngn ng truy vn chuyn dng, chng hn nh
SQL cho cc c s d liu qua h v XQuery cho XML. V vy, ngi pht trin c
tm hiu mt ngn ng truy vn mi cho tng loi hnh d liu ngun hoc nh dng d
liu m h yu cu tm kim. Ngn ng tch hp truy vn (LINQ) a ra mt m hnh
n gin, nht qun lm vic vi cc d liu trn cc loi d liu ngun v cc nh
dng. Trong mt truy vn LINQ, bn lun lun lm vic vi cc chng trnh i tng.

Mt truy vn LINQ hot ng bao gm ba hnh ng: nhn cc ngun hoc cc
ngun d liu, to cc truy vn, v thc hin cc truy vn.
D liu ngun c thc hin chung giao din IEnumerable <T> c th c truy
vn thng qua LINQ. Gi AsEnumerable trn mt DataTable tr v mt i tng no
m thi hnh chung interface IEnumerable <T>, phc v nh l cc d liu ngun cho
LINQ truy vn DataSet.
Trong truy vn, bn xc nh chnh xc ca thng tin m bn mun ly t ngun
d liu. Mt truy vn nh th no cng c th ch nh rng thng tin phi c sp xp,
gom nhm, v n c hnh thnh trc khi n c tr v. Trong LINQ, mt truy vn
c lu gi trong mt bin. Nu cc truy vn c thit k tr v mt chui ca cc
gi tr, cc bin truy vn phi l mt kiu lit k. Bin truy vn ny bin mt khng c
hnh ng v khng tr v d liu; n ch d tr trong my tnh thng tin truy vn. Sau
khi bn to ra mt truy vn m bn cn phi thc hin truy vn, tr v bt k d liu
no.
Trong mt truy vn m s tr v mt chui ca cc gi tr, cc bin truy vn chnh
n khng bao gi cha kt qu truy vn ch lu tr trong my tnh thng tin truy vn v
cc lnh truy vn. S thc thi cc truy vn l hon li cho n khi cc bin truy vn lp
li trong mt vng lp foreach. iu ny c gi l thc hin chm; c ngha l, thc
hin truy vn thi gian sau khi xy ra mt s truy vn c xy dng. iu ny c ngha
n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 121

l bn c th thc hin mt truy vn nh thng xuyn nh bn mun. iu ny rt hu
ch khi, v d, bn c mt c s d liu m ang c cp nht bi cc ng dng khc.
Trong ng dng ca bn, bn c th to mt truy vn, ly nhng thng tin mi nht v
lin tc thc hin cc truy vn, tr v mi ln thng tin cp nht .
Ngc li chm truy vn, m tr v mt chui ca cc gi tr, cc truy vn m tr
v mt gi tr c thc hin ngay lp tc. Mt s v d v truy vn tr v gi tr duy nht
l Count, Max, Average, v First. Nhng thc hin ngay lp tc bi v kt qu truy
vn c yu cu tnh ton kt qu duy nht. V d, tm kt qu truy vn trung bnh
phi c thc hin nh vy m cc chc nng trung bnh c d liu u vo lm vic
vi. Bn cng c th s dng cc ToList (Tsource) hoc ToArray (TSource) cc phng
thc trn mt truy vn thc thi ngay lp tc mt truy vn m khng a ra mt gi tr
duy nht. Nhng k thut ny thc hin ngay lp tc c th l hu ch khi bn mun
cache kt qu ca mt truy vn.
Sau y l mt on m ng dng m t mt truy vn trn DataSet.
V d sau s dng Chn tr li tt c cc dng sn phm t bng v hin th cc sn
phm.
// Fill the DataSet.
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);

DataTable products = ds.Tables["Product"];

IEnumerable<DataRow> query =
from product in products.AsEnumerable()
select product;

Console.WriteLine("Product Names:");
foreach (DataRow p in query)
{
Console.WriteLine(p.Field<string>("Name"));
}




XI. Ti liu tham kho:

n k s II Tm hiu cng ngh LINQ v ng dng

Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii
Trang 122

Ti liu c trch t MSDN Visual Studio2008.
Th vin MSDN online: http://msdn.microsoft.com/en- us/vbasic/aa904594.aspx
Nutshell online: http://www.albahari.com/nutshell/linqquiz.aspx

You might also like