Pro LINQ (eBook)
XXII, 840 Seiten
Apress (Verlag)
978-1-4302-2654-3 (ISBN)
LINQ is the part of the .NET Framework that provides a generic approach to querying data from different data sources. It has quickly become the next must-have skill for .NET developers. Pro LINQ: Language Integrated Query in C# 2010 is all about code. Literally, this book starts with code and ends with code. Most books show the simplest examples of how to use a method, but they so rarely show how to use the more complex prototypes. This book is different. Demonstrating the overwhelming majority of LINQ operators and prototypes, it is a veritable treasury of LINQ examples.
Rather than obscure the relevant LINQ principles in code examples by focusing on a demonstration application you have no interest in writing, this book cuts right to the chase of each LINQ operator, method, or class. However, where complexity is necessary to truly demonstrate an issue, the examples are right there in the thick of it. For example, code samples demonstrating how to handle concurrency conflicts actually create concurrency conflicts so you can step through the code and see them unfold.
Face it, most technical books, while informative, are dull. LINQ need not be dull. Written with a sense of humor, this book will attempt to entertain you on your journey through the wonderland of LINQ and C# 2010.
Joseph C. Rattz, Jr., unknowingly began his career in software development in 1990 when a friend asked him for assistance writing an ANSI text editor named ANSI Master for the Commodore Amiga. A hangman game (the Gallows) soon followed. From these compiled BASIC programs, he moved on to programming in C for more speed and power. Joe then developed applications that were sold to JumpDisk, an Amiga disk magazine, as well as Amiga World magazine. Due to developing in a small town on a fairly isolated platform, Joe learned all the wrong ways to write code. It was while trying to upgrade his poorly written applications that he gained respect for the importance of easily maintainable code. It was love at first sight when Joe spotted a source-level debugger in use for the first time. Two years later, Joe obtained his first software development opportunity at Policy Management Systems Corporation as an entry level programmer developing a client/server insurance application for OS/2 and Presentation Manager. Through the years, he added C++, Unix, Java, ASP, ASP.NET, C#, HTML, DHTML, and XML to his skill set, while developing applications for SCT, DocuCorp, IBM, and the Atlanta Committee for the Olympic Games, CheckFree, NCR, EDS, Delta Technology, Radiant Systems, and the Genuine Parts Company. Joe enjoys the creative aspects of user interface design, and he appreciates the discipline necessary for server-side development. But, given his druthers, his favorite development pastime is debugging code. Joe can be found working for the Genuine Parts Company the parent company of NAPA in the Automotive Parts Group Information Systems department, where he works on his baby, the storefront web site. This site for NAPA provides the stores a view into their accounts and data on a network of AS/400s.
LINQ is the part of the .NET Framework that provides a generic approach to querying data from different data sources. It has quickly become the next must-have skill for .NET developers. Pro LINQ: Language Integrated Query in C# 2010 is all about code. Literally, this book starts with code and ends with code. Most books show the simplest examples of how to use a method, but they so rarely show how to use the more complex prototypes. This book is different. Demonstrating the overwhelming majority of LINQ operators and prototypes, it is a veritable treasury of LINQ examples. Rather than obscure the relevant LINQ principles in code examples by focusing on a demonstration application you have no interest in writing, this book cuts right to the chase of each LINQ operator, method, or class. However, where complexity is necessary to truly demonstrate an issue, the examples are right there in the thick of it. For example, code samples demonstrating how to handle concurrency conflicts actually create concurrency conflicts so you can step through the code and see them unfold. Face it, most technical books, while informative, are dull. LINQ need not be dull. Written with a sense of humor, this book will attempt to entertain you on your journey through the wonderland of LINQ and C# 2010.
Joseph C. Rattz, Jr., unknowingly began his career in software development in 1990 when a friend asked him for assistance writing an ANSI text editor named ANSI Master for the Commodore Amiga. A hangman game (the Gallows) soon followed. From these compiled BASIC programs, he moved on to programming in C for more speed and power. Joe then developed applications that were sold to JumpDisk, an Amiga disk magazine, as well as Amiga World magazine. Due to developing in a small town on a fairly isolated platform, Joe learned all the wrong ways to write code. It was while trying to upgrade his poorly written applications that he gained respect for the importance of easily maintainable code. It was love at first sight when Joe spotted a source-level debugger in use for the first time. Two years later, Joe obtained his first software development opportunity at Policy Management Systems Corporation as an entry level programmer developing a client/server insurance application for OS/2 and Presentation Manager. Through the years, he added C++, Unix, Java, ASP, ASP.NET, C#, HTML, DHTML, and XML to his skill set, while developing applications for SCT, DocuCorp, IBM, and the Atlanta Committee for the Olympic Games, CheckFree, NCR, EDS, Delta Technology, Radiant Systems, and the Genuine Parts Company. Joe enjoys the creative aspects of user interface design, and he appreciates the discipline necessary for server-side development. But, given his druthers, his favorite development pastime is debugging code. Joe can be found working for the Genuine Parts Company the parent company of NAPA in the Automotive Parts Group Information Systems department, where he works on his baby, the storefront web site. This site for NAPA provides the stores a view into their accounts and data on a network of AS/400s.
Title Page 1
Copyright Page 2
Contents at a Glance 4
Table of Contents 6
About the Author 20
About the Technical Reviewer 21
Acknowledgments 22
Part 1 Pro LINQ: Language Integrated Query in C# 2010 23
Chapter 1 Hello LINQ 24
A Paradigm Shift 24
Query XML 25
Query a SQL Server Database 26
Introduction 28
LINQ Is About Data Queries 28
LINQ to Objects 28
LINQ to XML 29
LINQ to DataSet 29
LINQ to SQL 29
LINQ to Entities 29
How to Obtain LINQ 29
LINQ Is Not Just for Queries 29
Tips to Get You Started 33
Use the var Keyword When Confused 33
Use the Cast or OfType Operators for Legacy Collections 35
The OfType Operator versus the Cast Operator 36
Don’t Assume a Query Is Bug-Free 36
Take Advantage of Deferred Queries 37
Use the DataContext Log 38
Use the LINQ Forum 39
Summary 39
Chapter 2 C# Language Enhancements for LINQ 41
C# Language Additions 41
Lambda Expressions 42
Using Named Methods 42
Using Anonymous Methods 43
Using Lambda Expressions 44
Expression Trees 47
Keyword var, Object Initialization, and Anonymous Types 48
The Implicitly Typed Local Variable Keyword var 49
Object and Collection Initialization Expressions 50
Anonymous Types 52
Extension Methods 53
Instance (Object) vs. Static (Class) Methods Recap 54
The Problem Solved by Extension Methods 55
The Solution 56
Extension Method Declarations and Invocations 57
Extension Method Precedence 58
Partial Methods 59
A Partial Method Example 59
What Is the Point of Partial Methods? 61
The Rules 61
Query Expressions 61
Query Expression Grammar 63
Query Expression Translation 64
Summary 72
Part 2 LINQ to Objects 74
Chapter 3 LINQ to Objects Introduct ion 75
LINQ to Objects Overview 75
IEnumerable< T>
Returning IEnumerable< T>
Func Delegates 81
The Standard Query Operators Alphabetical Cross-Reference 82
A Tale of Two Syntaxes 84
Summary 85
Chapter 4 Deferred Operators 86
Referenced Namespaces 86
Referenced Assemblies 86
Common Classes 87
The Deferred Operators by Purpose 88
Restriction 89
Where 89
Projection 91
Select 92
SelectMany 98
Partitioning 102
Take 102
TakeWhile 105
Skip 107
SkipWhile 108
Concatenation 110
Concat 110
Ordering 114
OrderBy 114
OrderByDescending 120
ThenBy 124
ThenByDescending 128
Reverse 132
Join 133
Join 133
GroupJoin 135
Grouping 137
GroupBy 137
Set 144
Distinct 144
Union 146
Intersect 147
Except 149
Conversion 151
Cast 151
OfType 153
AsEnumerable 155
Element 158
DefaultIfEmpty 158
Generation 163
Range 163
Repeat 164
Empty 165
Summary 166
Chapter 5 Nondeferred Operators 167
Referenced Namespaces 167
Common Classes 167
The Nondeferred Operators by Purpose 171
Conversion 171
ToArray 171
ToList 173
ToDictionary 175
ToLookup 180
Equality 184
SequenceEqual 185
Element 188
First 188
FirstOrDefault 190
Last 192
LastOrDefault 194
Single 197
SingleOrDefault 198
ElementAt 201
ElementAtOrDefault 202
Quantifiers 203
Any 203
All 205
Contains 207
Aggregate 209
Count 210
LongCount 211
Sum 213
Min 215
Max 218
Average 220
Aggregate 223
Summary 225
Part 3 LINQ to XML 227
Chapter 6 LINQ to XML Introduction 228
Introduction 230
Cheating the W3C DOM XML API 231
Summary 232
Chapter 7 The LINQ to XML API 234
Referenced Namespaces 234
Significant API Design Enhancements 234
XML Tree Construction Simplified with Functional Construction 235
Document Centricity Eliminated in Favor of Element Centricity 237
Names, Namespaces, and Prefixes 239
Node Value Extraction 242
The LINQ to XML Object Model 245
Deferred Query Execution, Node Removal, and the Halloween Problem 246
XML Creation 249
Creating Elements with XElement 249
Creating Attributes with XAttribute 252
Creating Comments with XComment 253
Creating Containers with XContainer 253
Creating Declarations with XDeclaration 254
Creating Document Types with XDocumentType 255
Creating Documents with XDocument 256
Creating Names with XName 257
Creating Namespaces with XNamespace 258
Creating Nodes with XNode 258
Creating Processing Instructions with XProcessingInstruction 258
Creating Streaming Elements with XStreamingElement 261
Creating Text with XText 262
Creating CData with XCData 263
XML Output 263
Saving with XDocument.Save() 263
Saving with XElement.Save() 265
XML Input 266
Loading with XDocument.Load() 266
Loading with XElement.Load() 268
Parsing with XDocument.Parse() or XElement.Parse() 268
XML Traversal 269
Traversal Properties 270
Forward with XNode.NextNode 271
Backward with XNode.PreviousNode 271
Up to Document with XObject.Document 272
Up with XObject.Parent 273
Traversal Methods 274
Down with XContainer.Nodes() 275
Down with XContainer.Elements() 279
Down with XContainer.Element() 281
Up Recursively with XNode.Ancestors() 282
Up Recursively with XElement.AncestorsAndSelf() 283
Down Recursively with XContainer.Descendants() 284
Down Recursively with XElement.DescendantsAndSelf() 285
Forward with XNode.NodesAfterSelf() 286
Forward with XNode.ElementsAfterSelf() 287
Backward with XNode.NodesBeforeSelf() 288
Backward with XNode.ElementsBeforeSelf() 289
XML Modification 291
Adding Nodes 291
XContainer.Add() (AddLast) 292
XContainer.AddFirst() 293
XNode.AddBeforeSelf() 293
XNode.AddAfterSelf() 295
Deleting Nodes 296
XNode.Remove() 296
IEnumerable< T>
XElement.RemoveAll() 299
Updating Nodes 300
XElement.Value on XElement Objects, XText.Value on XText Objects, and XComment.Value on XComment Objects 300
XDocumentType.Name, XDocumentType.PublicId, XDocumentType.SystemId, and XDocumentType.InternalSubset on XDocumentType Objects 301
XProcessingInstruction.Target on XProcessingInstruction Objects and XProcessingInstruction.Data on XProcessingInstruction Objects 302
XElement.ReplaceAll() 303
XElement.SetElementValue() on Child XElement Objects 304
XML Attributes 306
Attribute Creation 306
Attribute Traversal 306
Forward with XElement.FirstAttribute 306
Forward with XAttribute.NextAttribute 307
Backward with XAttribute.PreviousAttribute 307
Backward with XElement.LastAttribute 308
XElement.Attribute() 309
XElement.Attributes() 309
Attribute Modification 310
Adding Attributes 310
Deleting Attributes 310
Updating Attributes 313
XElement.SetAttributeValue() 314
XML Annotations 315
Adding Annotations with XObject.AddAnnotation() 316
Accessing Annotations with XObject.Annotation() or XObject.Annotations() 316
Removing Annotations with XObject.RemoveAnnotations() 316
Annotations Example 316
XML Events 320
XObject.Changing 320
XObject.Changed 320
A Couple of Event Examples 321
Trick or Treat, or Undefined? 325
Summary 325
Chapter 8 LINQ to XML Operators 327
Introduction to LINQ to XML Operators 327
Ancestors 328
Prototypes 328
Examples 328
AncestorsAndSelf 333
Prototypes 333
Examples 333
Attributes 335
Prototypes 336
Examples 336
DescendantNodes 338
Prototypes 338
Examples 339
DescendantNodesAndSelf 340
Prototypes 340
Examples 340
Descendants 342
Prototypes 342
Examples 342
DescendantsAndSelf 345
Prototypes 345
Examples 345
Elements 348
Prototypes 348
Examples 348
InDocumentOrder 350
Prototypes 350
Examples 351
Nodes 352
Prototypes 352
Examples 353
Remove 354
Prototypes 354
Examples 354
Summary 357
Chapter 9 Additional XML Capabilities 358
Referenced Namespaces 358
Queries 359
No Reaching 359
A Complex Query 361
Transformations 368
Transformations Using XSLT 368
Transformations Using Functional Construction 370
Tips 372
Simplify Complex Tasks with Helper Methods 373
Suppressing Node Construction with null 373
Handling Multiple Peer Nodes While Remaining Flat 376
Validation 379
The Extension Methods 379
Prototypes 380
Obtaining an XML Schema 381
Examples 383
XPath 396
Prototypes 396
Examples 397
Summary 397
Part 4 LINQ to DataSet 399
Chapter 10 LINQ to DataSet Operators 400
Assembly References 401
Referenced Namespaces 401
Common Code for the Examples 401
DataRow Set Operators 403
Distinct 403
Prototypes 403
Examples 404
Except 407
Prototypes 408
Examples 408
Intersect 410
Prototypes 410
Examples 410
Union 412
Prototypes 412
Examples 413
SequenceEqual 415
Prototypes 415
Examples 415
DataRow Field Operators 416
Field< T>
Prototypes 421
Examples 422
SetField< T>
Prototypes 427
Examples 427
DataTable Operators 430
AsEnumerable 430
Prototypes 430
Examples 431
CopyToDataTable< DataRow>
Prototypes 431
Examples 432
Summary 437
Chapter 11 Additional DataSet Capabil ities 438
Required Namespaces 438
Typed DataSets 438
Putting It All Together 440
Summary 443
Part 5 LINQ to SQL 445
Chapter 12 LINQ to SQL Introduct ion 446
Introducing LINQ to SQL 447
The DataContext 448
Entity Classes 449
Associations 449
Concurrency Conflict Detection 450
Concurrency Conflict Resolution 450
Prerequisites for Running the Examples 451
Obtaining the Appropriate Version of the Northwind Database 451
Generating the Northwind Entity Classes 451
Generating the Northwind XML Mapping File 452
Using the LINQ to SQL API 453
IQueryable< T>
Some Common Methods 453
GetStringFromDb() 453
ExecuteStatementInDb() 455
Summary 456
Chapter 13 LINQ to SQL Tips and Tools 457
Introduction to LINQ to SQL Tips and Tools 457
Tips 457
Use the DataContext.Log Property 458
Use the GetChangeSet() Method 459
Consider Using Partial Classes or Mapping Files 459
Consider Using Partial Methods 459
Tools 459
SQLMetal 460
XML Mapping File Vs. DBML Intermediate File 465
Working with DBML Intermediate Files 465
The Object Relational Designer 466
Creating Your LINQ to SQL Classes File 467
Connecting the DataContext to the Database 468
Adding an Entity Class 469
Editing the Entity Class Model 472
Adding Objects to the Entity Class Model 473
Overriding the Insert, Update, and Delete Methods 474
Use SQLMetal and the O/R Designer Together 480
Summary 481
Chapter 14 LINQ to SQL Database Operations 482
Prerequisites for Running the Examples 482
Some Common Methods 482
Using the LINQ to SQL API 483
Standard Database Operations 483
Inserts 483
Inserting Attached Entity Objects 486
Queries 487
Exceptions to the Norm 489
Associations 490
Joins 503
Deferred Query Execution 508
The SQL IN Statement with the Contains Operator 511
Updates 513
Updating Associated Classes 513
Deletes 517
Deleting Attached Entity Objects 518
Deleting Relationships 519
Overriding Database Modification Statements 520
Overriding the Insert Method 520
Overriding the Update Method 521
Overriding the Delete Method 521
Example 521
Overriding in the Object Relational Designer 524
Considerations 524
SQL Translation 524
Summary 527
Chapter 15 LINQ to SQL Ent ity Classes 528
Prerequisites for Running the Examples 528
Entity Classes 528
Creating Entity Classes 528
Generating Entity Classes 529
Writing Entity Classes by Hand 529
Entity Class Attributes and Attribute Properties 544
XML External Mapping File Schema 559
Projecting into Entity Classes vs. Nonentity Classes 559
Prefer Object Initialization to Parameterized Construction When Projecting 561
Extending Entity Classes with Partial Methods 565
Important System.Data.Linq API Classes 567
EntitySet< T>
EntityRef< T>
Entity 567
HasLoadedOrAssignedValue 568
Table< T>
IExecuteResult 570
ReturnValue 571
GetParameterValue 571
ISingleResult< T>
ReturnValue 572
IMultipleResults 572
ReturnValue 573
GetResult< T>
Summary 573
Chapter 16 The LINQ to SQL DataContext 575
Prerequisites for Running the Examples 575
Some Common Methods 575
Using the LINQ to SQL API 575
[Your]DataContext Class 575
The DataContext Class 576
The DataContext Class Implements IDisposable 579
Primary Purposes 579
Identity Tracking 579
Change Tracking 584
Change Processing 585
The Data Context Lifetime 586
DataContext() and [Your]DataContext() 586
Prototypes 586
Examples 587
SubmitChanges() 600
Prototypes 600
Examples 601
DatabaseExists() 608
Prototypes 608
Examples 608
CreateDatabase() 609
Prototypes 609
Examples 609
DeleteDatabase() 610
Prototypes 611
Examples 611
CreateMethodCallQuery() 611
Prototypes 611
Examples 612
ExecuteQuery() 613
Prototypes 613
Examples 614
Translate() 616
Prototypes 616
Examples 616
ExecuteCommand() 617
Prototypes 618
Examples 618
ExecuteMethodCall() 619
Prototypes 619
Examples 620
GetCommand() 627
Prototypes 627
Examples 628
GetChangeSet() 629
Prototypes 629
Examples 629
GetTable() 631
Prototypes 631
Examples 631
Refresh() 632
Prototypes 633
Examples 634
Summary 640
Chapter 17 LINQ to SQL Concurrency Conf licts 641
Prerequisites for Running the Examples 641
Some Common Methods 641
Using the LINQ to SQL API 641
Concurrency Conflicts 641
Optimistic Concurrency 642
Conflict Detection 642
Conflict Resolution 646
Pessimistic Concurrency 653
An Alternative Approach for Middle Tiers and Servers 656
Summary 658
Chapter 18 Additional LINQ to SQL Capabi lities 659
Prerequisites for Running the Examples 659
Using the LINQ to SQL API 659
Using the LINQ to XML API 659
Database Views 659
Entity Class Inheritance 661
Transactions 667
Summary 669
Part 6 LINQ to Ent ities 671
Chapter 19 LINQ to Entities Introduction 672
Introducing LINQ to Entities 673
The ObjectContext 674
Entity Classes 674
Associations 675
Prerequisites for Running the Examples 675
Obtaining the Appropriate Version of the Northwind Database 675
Generating the Northwind Entity Data Model 675
Using the LINQ to Entities API 679
IQueryable< T>
Some Common Methods 680
GetStringFromDb() 680
ExecuteStatementInDb() 681
Summary 682
Chapter 20 LINQ to Entities Operations 683
Prerequisites for Running the Examples 683
Some Common Methods 683
Standard Database Operations 684
Inserts 684
Creating Partially Populated Entity Types 685
Inserting Attached Entity Objects 687
Queries 691
Basic Queries 691
Compiled Queries 692
Seeing the SQL Statement 694
Loading Related Objects 695
Querying Views 700
Querying Stored Procedures 701
Joins 705
Updates 708
Updating Associated Objects 708
Deletes 709
Deleting Related Objects 712
Managing Concurrency 719
Enabling Concurrency Checks 720
Handling Concurrency Conflicts 721
Summary 726
Chapter 21 LINQ to Entities Classes 727
Prerequisites for Running the Examples 727
The ObjectContext Class 727
Constructor 728
Prototypes 728
Examples 728
DatabaseExists() 730
Prototypes 730
Examples 730
DeleteDatabase() 730
Prototypes 730
Examples 730
CreateDatabase() 731
Prototypes 731
Examples 731
SaveChanges() 731
Prototypes 732
Examples 732
Refresh() 732
Prototypes 732
Examples 733
AddObject() 733
Prototypes 733
Examples 734
CreateObject() 734
Prototypes 734
Examples 735
DeleteObject() 735
Prototypes 736
Examples 736
EntityObject 736
Constructor 736
Prototypes 736
Examples 737
Factory Method 737
Prototypes 737
Examples 739
Primitive Properties 739
Prototypes 739
Examples 740
Navigation Properties 741
Prototypes 741
Examples 743
EntityReference 744
Load() 744
Examples 744
Value 745
EntityCollection 745
Add() 745
Remove() 747
Prototypes 747
Examples 748
Clear() 749
Prototypes 749
Contains() 750
Prototypes 750
Examples 750
Load() 751
Count 751
Prototypes 751
Examples 751
Summary 752
Part 7 Parallel LINQ 753
Chapter 22 Paral lel LINQ Introduction 754
Introducing Parallel LINQ 754
Parallel LINQ Is for Objects 759
Using the LINQ to Entities API 759
Summary 759
Chapter 23 Using Parallel LINQ 760
Creating a Parallel LINQ Query 760
Preserving Result Ordering 763
Controlling Parallelism 766
Forcing Parallel Execution 766
Limiting the Degree of Parallelism 767
Dealing with Exceptions 767
Queries Without Results 771
Creating Ranges and Repetitions 773
Summary 774
Chapter 24 Paral lel LINQ Operators 775
ParallelQuery Creation Operators 775
AsParallel 775
Prototypes 775
Examples 776
Range 779
Prototypes 779
Examples 779
Repeat 780
Empty 781
Prototypes 781
Execution Control Operators 781
AsOrdered 781
Prototypes 782
Examples 782
AsUnordered 784
Prototypes 784
Examples 784
AsSequential 785
Prototypes 785
Examples 786
AsEnumerable 786
Prototypes 787
Examples 787
WithDegreeOfParallelism 787
Prototypes 788
Examples 788
WithExecutionMode 788
Prototypes 789
Examples 789
WithMergeOptions 789
Prototypes 790
Examples 790
Conversion Operators 792
Cast 792
OfType 793
The ForAll Operator 794
Prototypes 794
Examples 794
Summary 795
Index 796
Erscheint lt. Verlag | 28.12.2010 |
---|---|
Zusatzinfo | XXII, 840 p. |
Verlagsort | Berkeley |
Sprache | englisch |
Themenwelt | Mathematik / Informatik ► Informatik ► Programmiersprachen / -werkzeuge |
Informatik ► Software Entwicklung ► Objektorientierung | |
Mathematik / Informatik ► Informatik ► Theorie / Studium | |
Schlagworte | C# • Class • Complexity • Database • object • SQL • XML |
ISBN-10 | 1-4302-2654-4 / 1430226544 |
ISBN-13 | 978-1-4302-2654-3 / 9781430226543 |
Haben Sie eine Frage zum Produkt? |
![PDF](/img/icon_pdf_big.jpg)
Größe: 11,7 MB
DRM: Digitales Wasserzeichen
Dieses eBook enthält ein digitales Wasserzeichen und ist damit für Sie personalisiert. Bei einer missbräuchlichen Weitergabe des eBooks an Dritte ist eine Rückverfolgung an die Quelle möglich.
Dateiformat: PDF (Portable Document Format)
Mit einem festen Seitenlayout eignet sich die PDF besonders für Fachbücher mit Spalten, Tabellen und Abbildungen. Eine PDF kann auf fast allen Geräten angezeigt werden, ist aber für kleine Displays (Smartphone, eReader) nur eingeschränkt geeignet.
Systemvoraussetzungen:
PC/Mac: Mit einem PC oder Mac können Sie dieses eBook lesen. Sie benötigen dafür einen PDF-Viewer - z.B. den Adobe Reader oder Adobe Digital Editions.
eReader: Dieses eBook kann mit (fast) allen eBook-Readern gelesen werden. Mit dem amazon-Kindle ist es aber nicht kompatibel.
Smartphone/Tablet: Egal ob Apple oder Android, dieses eBook können Sie lesen. Sie benötigen dafür einen PDF-Viewer - z.B. die kostenlose Adobe Digital Editions-App.
Buying eBooks from abroad
For tax law reasons we can sell eBooks just within Germany and Switzerland. Regrettably we cannot fulfill eBook-orders from other countries.
aus dem Bereich