Return String。Concat(New Object() _ {〃Identifier (〃; Me。Identifier; 〃) Points (〃; Me。Points; 〃)〃}) End Function …………………………………………………………Page 435…………………………………………………………… CH AP T E R 1 5 ■ L E A R N I N G A B OU T L I N Q 413 Public Identifier As String Public Points As Integer End Class ■Note The GetHashCode() implementation here is rudimentary。 In the source code that es with this book; you will find a GetHashCode library class; which makes it simpler to implement GetHashCode()。 The source code is in the project ServerSideSpreadsheet/Devspace。Trader。mon/Automators。 Look at how GetHashCode() and Equals() are implemented。 Notice that the points data member is ignored。 In the case of a customer; this is acceptable; because a customer with iden tical identifiers but unequal points does not imply two separate customers。 Implementing Equals() and GetHashCode() for custom types is absolutely imperative; because the set operations use that information to determine whether two objects are identical。 If you don’t implement either method; the set operations will use the default implementations of Equals() and GetHashCode(); which are inplete and will give you the wrong results。 The next step is to create two separate lists of customers。 In this example; both lists contain the same valued customer。 Realize that the identical customer is not the same object instance; but contains the same values。 Dim customers1 As Customer() = New Customer() { _ New Customer() With {。Identifier = 〃Person 1〃; 。Points = 0}; _ New Customer() With {。Identifier = 〃Person 2〃; 。Points = 10}} Dim customers2 As Customer() = New Customer() { _ New Customer() With {。Identifier = 〃Person 3〃; 。Points = 0}; _ New Customer() With {。Identifier = 〃Person 2〃; 。Points = 10}} To get a list of all unique customers; you can use Union(); as follows: Dim uniqueCustomers = customers1。Union(customers2) Contained within the list represented by the variable uniqueCustomers will be the three customers of the two lists。 Using LINQ in Other Contexts So far; all of the examples in this chapter involved using LINQ and objects。 However; LINQ is not just an object…searching technology。 It is also usable with XML and relational databases。 Using LINQ with these other data sources is not a problem; since the querying is identical。 What is a problem is getting the query to work in the first place。 Consider Figure 15…1; which illustrates the LINQ architecture。 As you can see in Figure 15…1; all programming languages can access the LINQ library。 The data manipulated by the LINQ library es from what is called a LINQ…enabled data source。 The examples that you’ve seen use the LINQ to objects data source。 …………………………………………………………Page 436…………………………………………………………… 414 CH AP T E R 1 5 ■ L E A R N I N G A B OU T L I N Q Figure 15…1。 LINQ architecture (based on an image in MSDN Magazine; http://msdn。microsoft。/ msdnmag/issues/07/06/csharp30/default。aspx) However; there is also the possibility to use a LINQ…enabled ADO connection。 The good news is that you can use LINQ with a relational database。 The bad news is that the rela tional database’s ADO driver must support the special LINQ characteristics。 At the time of this writing; only the Microsoft SQL Server driver supports LINQ。 Currently; the drivers for Microsoft Access; MySQL; and other relational databases do not support LINQ。 Consider this LINQ query: Dim northwind As NorthwindDataContext = _ New NorthwindDataContext() Dim products = From p In northwind。Products _ Where p。OrderDetails。Count = 0 And p。UnitPrice 》 100 _ Select p Notice the code in the From statement。 The data source is an object that references the rela tional database Products table。 If a database driver is optimized for LINQ; it will understand the LINQ query and optimize it as if it were a SQL statement。 If your database driver does not support LINQ; then you have a problem because; in theory; you would need to download all the data from the table; and then execute the LINQ query。 That would waste resources and is not remended。 …………………………………………………………Page 437…………………………………………………………… CH AP T E R 1 5 ■ L E A R N I N G A B OU T L I N Q 415 ■Note For examples of LINQ using relational databases; see Beginning VB 2008 Databases by Vidya Vrat Agarwal and James Huddleston (Apress; 2008)。 Let’s say that you want to execute LINQ on an XML document。 Consider the following XML LINQ code (from http://hookedonlinq。/LINQtoXML5MinuteOverview。ashx)。 Dim loaded As XDocument = XDocument。Load(〃C:contacts。xml〃) " Query the data and write out a subset of contacts Dim q = From c In loaded。Descendants(〃contact〃) _ Where CType(c。Attribute(〃contactId〃)。Value; Integer) 《 4 _ Select c。Element(〃firstName〃)。ToString() & 〃 〃 & _ c。Element(〃lastName〃)。ToString() Notice how the same LINQ syntax that you’ve seen in the previous examples is used; but the source of the data that is to be manipulated by LINQ is different。 Keep in mind that when you are manipulating data using LINQ; you are manipulating objects that may point to XML files; relational databases; or plain…vanilla data objects。 The Important Stuff to Remember In this chapter; you learned about the basics of LINQ and how t