do_an_LINQ

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