For my amazing wife Vickey, who managed to keep our house
a home all by herself for these past, long 17 months.
Thank you for doing the things that gave me time to work on this book.
Rattz_789-3FRONT.fm Page iii Thursday, October 25, 2007 8:59 AM
Rattz_789-3FRONT.fm Page iv Thursday, October 25, 2007 8:59 AM
v
Contents at a Glance
About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii
About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxi
PART 1 ■ ■ ■ Pro LINQ: Language Integrated
Query in C# 2008
■CHAPTER 1 Hello LINQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
■CHAPTER 2 C# 3.0 Language Enhancements for LINQ . . . . . . . . . . . . . . . . . . . . . 19
PART 2 ■ ■ ■ LINQ to Objects
■CHAPTER 3 LINQ to Objects Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
■CHAPTER 4 Deferred Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
■CHAPTER 5 Nondeferred Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
PART 3 ■ ■ ■ LINQ to XML
■CHAPTER 6 LINQ to XML Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
■CHAPTER 7 The LINQ to XML API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
■CHAPTER 8 LINQ to XML Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
■CHAPTER 9 Additional XML Capabilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
PART 4 ■ ■ ■ LINQ to DataSet
■CHAPTER 10 LINQ to DataSet Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
■CHAPTER 11 Additional DataSet Capabilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
Rattz_789-3FRONT.fm Page v Thursday, October 25, 2007 8:59 AM
vi
PART 5 ■ ■ ■ LINQ to SQL
■CHAPTER 12 LINQ to SQL Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381
■CHAPTER 13 LINQ to SQL Tips and Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 391
■CHAPTER 14 LINQ to SQL Database Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
■CHAPTER 15 LINQ to SQL Entity Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457
■CHAPTER 16 The DataContext . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499
■CHAPTER 17 Concurrency Conflicts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557
■CHAPTER 18 Additional SQL Capabilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573
■INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585
Rattz_789-3FRONT.fm Page vi Thursday, October 25, 2007 8:59 AM
vii
Contents
About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii
About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix
Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxi
PART 1 ■ ■ ■ Pro LINQ: Language Integrated
Query in C# 2008
■CHAPTER 1 Hello LINQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
A Paradigm Shift . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Query XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Query a SQL Server Database. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
LINQ Is About Data Queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
How to Obtain LINQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
LINQ Is Not Just for Queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Tips to Get You Started . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Use the var Keyword When Confused . . . . . . . . . . . . . . . . . . . . . . . . 11
Use the Cast or OfType Operators for Legacy Collections . . . . . . . . 12
Prefer the OfType Operator to the Cast Operator . . . . . . . . . . . . . . . 13
Don’t Assume a Query Is Bug-Free . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Take Advantage of Deferred Queries . . . . . . . . . . . . . . . . . . . . . . . . . 15
Use the DataContext Log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Use the LINQ Forum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Rattz_789-3FRONT.fm Page vii Thursday, October 25, 2007 8:59 AM
viii
■CONTENTS
■CHAPTER 2 C# 3.0 Language Enhancements for LINQ . . . . . . . . . . . . . . . . 19
New C# 3.0 Language Additions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Lambda Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Expression Trees. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Keyword var, Object Initialization, and Anonymous Types. . . . . . . . 25
Extension Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Partial Methods. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Query Expressions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
PART 2 ■ ■ ■ LINQ to Objects
■CHAPTER 3 LINQ to Objects Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
LINQ to Objects Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
IEnumerable<T>, Sequences, and the Standard Query Operators . . . . . 54
Returning IEnumerable<T>, Yielding, and Deferred Queries . . . . . . . . . 55
Func Delegates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
The Standard Query Operators Alphabetical Cross-Reference . . . . . . . . 59
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
■CHAPTER 4 Deferred Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Referenced Namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Referenced Assemblies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Common Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
The Deferred Operators by Purpose . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Restriction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Projection. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Partitioning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Concatenation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Ordering. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Join. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Grouping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
Conversion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
Element . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
Generation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
Rattz_789-3FRONT.fm Page viii Thursday, October 25, 2007 8:59 AM
■CONTENTS
ix
■CHAPTER 5 Nondeferred Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Referenced Namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Common Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
The Nondeferred Operators by Purpose . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Conversion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Equality . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Element . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
Quantifiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
Aggregate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
PART 3 ■ ■ ■ LINQ to XML
■CHAPTER 6 LINQ to XML Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
Cheating the W3C DOM XML API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
■CHAPTER 7 The LINQ to XML API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
Referenced Namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
Significant API Design Enhancements . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
XML Tree Construction Simplified with
Functional Construction
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
Document Centricity Eliminated in Favor of
Element Centricity
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
Names, Namespaces, and Prefixes . . . . . . . . . . . . . . . . . . . . . . . . . 197
Node Value Extraction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
The LINQ to XML Object Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Deferred Query Execution, Node Removal, and the
Halloween Problem
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
XML Creation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Creating Elements with XElement. . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Creating Attributes with XAttribute . . . . . . . . . . . . . . . . . . . . . . . . . . 208
Creating Comments with XComment . . . . . . . . . . . . . . . . . . . . . . . . 209
Creating Containers with XContainer . . . . . . . . . . . . . . . . . . . . . . . . 210
Creating Declarations with XDeclaration . . . . . . . . . . . . . . . . . . . . . 210
Creating Document Types with XDocumentType . . . . . . . . . . . . . . 211
Rattz_789-3FRONT.fm Page ix Thursday, October 25, 2007 8:59 AM
x
■CONTENTS
Creating Documents with XDocument . . . . . . . . . . . . . . . . . . . . . . . 212
Creating Names with XName . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
Creating Namespaces with XNamespace . . . . . . . . . . . . . . . . . . . . 214
Creating Nodes with XNode. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Creating Processing Instructions with XProcessingInstruction . . . 214
Creating Streaming Elements with XStreamingElement . . . . . . . . 216
Creating Text with XText . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Creating CData with XCData . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
XML Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
Saving with XDocument.Save() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
Saving with XElement.Save(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
XML Input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
Loading with XDocument.Load(). . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
Loading with XElement.Load(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Parsing with XDocument.Parse() or XElement.Parse() . . . . . . . . . . 223
XML Traversal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
Traversal Properties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
Traversal Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
XML Modification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Adding Nodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Deleting Nodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
Updating Nodes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
XElement.SetElementValue() on Child XElement Objects. . . . . . . . 253
XML Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
Attribute Creation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
Attribute Traversal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
Attribute Modification. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
XML Annotations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
Adding Annotations with XObject.AddAnnotation() . . . . . . . . . . . . . 263
Accessing Annotations with XObject.Annotation() or
XObject.Annotations()
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
Removing Annotations with XObject.RemoveAnnotations() . . . . . . 264
Annotations Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
XML Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
XObject.Changing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
XObject.Changed . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
A Couple of Event Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
Trick or Treat, or Undefined?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
Rattz_789-3FRONT.fm Page x Thursday, October 25, 2007 8:59 AM
■CONTENTS
xi
■CHAPTER 8 LINQ to XML Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
Introduction to LINQ to XML Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
Ancestors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
Prototypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
AncestorsAndSelf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
Prototypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
Attributes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
Prototypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
DescendantNodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
Prototypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
DescendantNodesAndSelf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
Prototypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
Descendants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Prototypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
DescendantsAndSelf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
Prototypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
Elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
Prototypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
InDocumentOrder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
Prototypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
Nodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
Prototypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
Remove . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
Prototypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
Rattz_789-3FRONT.fm Page xi Thursday, October 25, 2007 8:59 AM
xii
■CONTENTS
■CHAPTER 9 Additional XML Capabilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
Referenced Namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
Queries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
No Reaching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
A Complex Query . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
Transformations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
Transformations Using XSLT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
Transformations Using Functional Construction . . . . . . . . . . . . . . . 312
Tips. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
Validation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
The Extension Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
Prototypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
Obtaining an XML Schema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
XPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
Prototypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
PART 4 ■ ■ ■ LINQ to DataSet
■CHAPTER 10 LINQ to DataSet Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
Assembly References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
Referenced Namespaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
Common Code for the Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
DataRow Set Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
Distinct. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 342
Except . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 345
Intersect. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
Union . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
SequenceEqual . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
DataRow Field Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
Field<T> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
SetField<T> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362
DataTable Operators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
AsEnumerable. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
CopyToDataTable<DataRow>. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371
Rattz_789-3FRONT.fm Page xii Thursday, October 25, 2007 8:59 AM
Không có nhận xét nào:
Đăng nhận xét