Upload
huatrung17
View
13
Download
0
Embed Size (px)
Citation preview
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. 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
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 . 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 h tr cc c tnh chung
IQueryable m c bt u t IEnumerable.
// 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 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 , v mt danh sch Customer cc i
tng khch hng c th hin nh List. 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 , 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. IEnumerable (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 IEnumerable (T) cng ging
nh tp hp cc lp khng chung chng hn nh IEnumerable h tr ArrayList.
V.1 IEnumerable cc bin trong cc cu truy vn LINQ
Cc bin trong cu truy vn LINQ c kiu nh IEnumerable (T) hoc c kiu bt
ngun t mt ngun nh IQueryable (T). Khi bn xem mt cu truy vn c bin l kiu
IEnumerable, 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 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
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
var queryCustomersByCity =
from cust in customers
group cust by cust.City;
// customerGroup is an IGrouping
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 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 students = new List()
{
new Student {First="Svetlana",
Last="Omelchenko",
ID=111,
Street="123 Main Street",
City="Seattle",
Scores= new List {97, 92, 81, 60}},
new Student {First="Claire",
Last="ODonnell",
ID=112,
Street="124 Main Street",
City="Redmond",
Scores= new List {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 {88, 94, 65, 91}},
};
// Create the second data source.
List teachers = new List()
{
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 students = new List()
{
new Student {First="Svetlana", Last="Omelchenko", ID=111, Scores = new
List{97, 92, 81, 60}},
new Student {First="Claire", Last="ODonnell", ID=112, Scores = new
List{75, 84, 91, 39}},
new Student {First="Sven", Last="Mortensen", ID=113, Scores = new
List{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>
Svetlana
Omelchenko
97,92,81,60
Claire
O'Donnell
n k s II Tm hiu cng ngh LINQ v ng dng
Sinh vin thc hin Nguyn Vn Thy & Hong Mnh Gii Trang 23
75,84,91,39
Sven
Mortensen
88,94,65,91
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 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 numQuery1 =
from num in numbers
where num % 2 == 0
orderby num
select num;
//Method syntax:
IEnumerable 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 . 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 IEnumerable (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 IEnumerable. 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 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 students = new List
{
new Student {First="Svetlana", Last="Omelchenko", ID=111, Scores= new List
{97, 92, 81, 60}},
new Student {First="Claire", Last="ODonnell", ID=112, Scores= new List {75,
84, 91, 39}},
new Student {First="Sven", Last="Mortensen", ID=113, Scores= new List {88, 94,
65, 91}},
new Student {First="Cesar", Last="Garcia", ID=114, Scores= new List {97, 89,
85, 82}},
new Student {First="Debra", Last="Garcia", ID=115, Scores= new List {35, 72,
91, 70}},
new Student {First="Fadi", Last="Fakhouri", ID=116, Scores= new List {99, 86,
90, 94}},
new Student {First="Hanying", Last="Feng", ID=117, Scores= new List {93, 92,
80, 87}},
new Student {First="Hugo", Last="Garcia", ID=118, Scores= new List {92, 90,
83, 78}},
new Student {First="Lance", Last="Tucker", ID=119, Scores= new List {68, 79,
88, 92}},
new Student {First="Terry", Last="Adams", ID=120, Scores= new List {99, 82,
81, 79}},
new Student {First="Eugene", Last="Zabokritski", ID=121, Scores= new List {96,
85, 91, 60}},
new Student {First="Michael", Last="Tucker", ID=122, Scores= new List {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 IEnumerable. 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
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.
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
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 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 ID 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 results = db.ExecuteQuery(
@"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 results = db.ExecuteQuery(
"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 Customers = db.GetTable();
// 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 Customers;
public Table 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 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 dn