Projecting into an X-DOM

You can also use LINQ queries to project into an X-DOM. The source can be anything over which LINQ can query, such as:

  • LINQ to SQL Tables

  • A local collection

  • Another X-DOM

Regardless of the source, the strategy is the same in using LINQ to emit an X-DOM: you first write a functional construction expression that produces the desired X-DOM shape, and then build a LINQ query around the expression.

For instance, suppose we wanted to retrieve customers from a database into the following XML:

	<customers>
	  <customer id="1">
	    <name>Sue</name>
	    <buys>3</buys>
	  </customer>
	  ...
	</customers>

We start by writing a functional construction expression for the X-DOM using simple literals:

	var customers =
	  new XElement ("customers",
	    new XElement ("customer", new XAttribute ("id", 1),
	      new XElement ("name", "Sue"),
	      new XElement ("buys", 3)
	    )
	  );

We then turn this into a projection and build a LINQ query around it:

	var customers =
	  new XElement ("customers",
	    from c in dataContext.Customers
	    select
	      new XElement ("customer",
	        new XAttribute ("id", c.ID),
	        new XElement ("name", c.Name),
	        new XElement ("buys", c.Purchases.Count)
	      )
	    );

Here’s the result:

	<customers>
	  <customer id="1">
	    <name>Tom</firstname>
	    <buys>3</buys>
	  </customer>
	  <customer id="2">
	    <name>Harry</firstname>
	    <buys>2</buys>
	  </customer>
	    ...
	</customers>

The outer query in this case defines the line at which the query transitions from being a remote LINQ to SQL query to a local LINQ to enumerable query. XElement’s constructor doesn’t know ...

Get LINQ Pocket Reference now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.