Dennis' Blog

Avonturen in .NET
posts - 37, comments - 630, trackbacks - 0, articles - 0

Een eerste blik op LINQ

Posted on Thursday, November 10, 2005 10:10 PM

Het is alweer enige tijd geleden dat ik iets over C# 3.0 geschreven heb, maar dat ga ik nu (min of meer) goedmaken. Ik vervolg deze serie nu met een aantal artikelen over een van de toepassingen van de nieuwe mogelijkheden: Linq.

Linq staat voor Language Integrated Query. Zoals de naam al aangeeft geeft ons dat de mogelijkheid om in de taal (in dit geval C# maar VB.Net kan er ook mee overweg) queries te definieren. Het verhaal achter het ontstaan van Linq zal ik hier even kort schetsen, zodat je een beeld hebt wat de geschiedenis is.

Neem eens een stuk code dat je recentelijk geschreven hebt. Kijk er eens goed naar en ga dan kijken hoe vaak je in die code "zoekt" naar zaken. Denk bijvoorbeeld aan het doorlopen van een ArrayList instance met daarin Customer objecten. Regelmatig schrijf je code die in die lijst op zoek gaat naar alle klanten die nog een betaling open hebben staan. Of je wilt een overzicht van alle klanten in je lijst die aangegeven hebben dat ze informatie per email willen ontvangen. Of je wilt simpelweg in die lijst op zoek gaan naar die ene klant met klantnummer 'xyz123' zodat je de gegevens daarvan op het scherm kunt tonen. Als je goed kijkt, zul je zien dat het zoeken naar gegevens in lijsten (in wat voor vorm dan ook) best vaak voorkomt.

Echter, een goede methode om te zoeken is er niet. Neem de volgende code eens:

// Initializeer de boel
Customer displayCustomer = null;
bool bFound = false;
int counter = 0;
 
// Zoek de juiste klant
while( (!bFound) && (counter < customerList.Count) ) {
    displayCustomer = (Customer)customerList[counter];
    if( displayCustomer.CustomerID == "xyz123" ) {
        bFound = true;
    }
    counter++;
}
 
if( bFound ) {
    // Laat zien
} else {
    // Geef foutmelding
}

// Enzovoorts...

Ik weet het, deze code kan beter. Je kunt natuurlijk een specifieke CustomerList type definieren, met daarin de juiste zoekcode. Maar die zal er niet echt anders uitzien dan bovenstaande code.

Zoeken is behoorlijk belangrijk de meeste, serieuze applicaties. Er zijn vele voorbeelden te verzinnen: zoeken naar de inlognaam van de gebruiker om zijn of haar wachtwoord te controleren, zoeken naar de bestanden in de plugin-directory, zoeken naar de geinstalleerde printers op het systeem, zoeken naar.. affijn, je snapt het wel.

Zoeken gebeurdt uiteraard ook in databases. Da's mooi, zul je denken, want daar hoef ik niet zo veel voor te doen. Alles wat ik moet doen is de juiste SQL code schrijven en de database regelt het zelf wel. Maar heb je je wel eens gerealiseerd dat dat eigenlijk een hele vreemde constructie oplevert? Je schrijft hele mooie, goed gedocumenteerde, door de compiler op alle details gecontroleerde C# of VB.Net code, vervolgens plak je daar een string (!!!) in met daarin een stuk code in een hele andere taal, namelijk SQL. Denk daar eens over na: in onze code staat opeens een niet te controleren, niet te compileren en dus niet te verifieren string met een andere programmeertaal daarin. Vreemd, vind je niet?

Als je nu veel met XML werkt (en wie doet dat tegenwoordig niet?) dan krijg je te maken met weer een hele andere manier van zoeken in data. Nu kun je met XQuery of XPath aan de gang gaan, of je itereert zelf over de elementen in je XML document heen en goet alles zelf.

Zoeken, zoeken en zoeken. We doen het nogal eens in onze applicatie, op heel veel verschillende en elkaar min of meer tegensprekende methodes. Om daar nu wat aan te doen, is het Project Linq geboren. Het idee hierachter is: laten we alle mogelijke manieren van zoeken (querien in slecht nederlands) nu eens onder de loep nemen en daar een uniforme, strongly typed, verifieerbare en compileerbare methode voor verzinnen. En dat hebben ze gedaan.

Al gauw bleek dat dat niet zo eenvoudig was en om dat op een goede manier te doen moest de taal C# en VB.Net aangepast worden. Welke aanpassingen dat zijn, heb je in mijn vorige postings kunnen lezen (ja ja, er zat een lijn in het verhaal!). Met die uitbreidingen is Linq mogelijk geworden. Ik zal nog even op een rijtje zetten welke nieuwe mogelijkheden er komen:

  • Type inferrence (var q = ....)

  • Extension methods

  • Initializers

  • Anonymous types

  • Lambda expressions

Met dit alles kunnen we bovenstaande code anders gaan schrijven, op een manier die ons behoorlijk bekend voor zal komen:
 

var displayCustomer = from customer in customerList
                      where customer.CustomerID == "xyz123"
                      select customer;
 
if (displayCustomer != null)
{
    // Laat zien
}
else
{
    // Geef foutmelding
}

En dit doet dus precies hetzelfde...

Laat je niet verwarren door de rare plaatsing van 'select', dit leg ik nog wel uit. Maar afgezien daarvan is dit 'gewoon' SQL in C# syntax. De enige aanpassing die ik gedaan heb is dat customerList nu geen ArrayList meer is maar een List<Customer>. Dat maakt echter voor mijn verhaal niets uit.

Laten we eens kijken hoe dit nou kan.

Je moet weten dat de namespace System.Query (waar Linq in is gedefnieerd) voornamelijk bestaat uit een aantal extension methods op het type IEnumerable<T>. Met andere woorden: alles wat de interface IEnumerable<T> implementeert heeft een aantal extra methods gekregen. Een van die methods is bijvoorbeeld Where(); Die zit er als volgt uit:

IEnumerable<T> IEnumerable.Where<T>((T) => bool : predicate)

Met andere woorden: de method Where heeft als resultaat een IEnumerable<T> en als argument de lambda expression (T) => bool: predicate, oftewel er wordt een anonymous method gemaakt die een bool terug geeft. Dus als we dat even toepassen op onze customerList gaat dat er als volgt uitzien:

var resultList = customerList.Where( (Customer c) => c.CustomerID == "xyz123" );

Vertaling: neem onze List<Customer> customerList (welke IEnumerable<Customer> implementeert). Voer daar de 'Where' method op uit. In die Where method geven we mee de lambda expressie (nogmaals, lees mijn vorige postings over dit onderwerp om te begrijpen wat dat precies is) (Customer c) => c.CustomerID == "xyz123" . Er wordt nu dus een anonymous method gedefnieerd die voor iedere Customer instance in de lijst kijkt naar de CustomerID en die vergelijkt met "xyz123". Daar komt een bool uit (true of false) en als hij true is, dan wordt die Customer instance aan de nieuwe resultList toegevoegd. Overigens is resultList ook een class die IEnumerable<T> implementeert....

Kijk hier nog eens goed naar, laat het even bezinken. Ik wacht wel even.

Goed. Het resultaat is dus een IEnumerable<T>. Daarop kunnen we dan weer andere extension methods toepassen, welke bijna allemaal een IEnumerable<T> terug geven. We kunnen dus een hele rij van dit soort methods aanroepen: Lijst.Where().Where().GroupBy().Select(); Anders weergegeven:

Lijst.Where().
 Where().
 GroupBy().
 Select();
 

Nou hebben we net gezien in mijn voorbeeld dat we helemaal geen IEnumerable<T>.Where() method gebruiken. Nee, we roepen gewoon from type x in lijst where x.iets == "bla" select x.ID; of zo iets dergelijks. De reden dat dat werkt is door het gebruik van Expression Trees. Dat is wellicht iets voor andere posting, maar neem nu maar even van me aan dat dat er voor zorgt dat onze mooie, SQL-achtige syntax verandert in die reeks van method calls en dat alle code achter bijvoorbeeld de where vertaalt wordt in een lambda expressie. Moeilijk is dat niet, het is een kwestie van haakjes en dergelijke toevoegen.

Dat betekent dat onze eerste voorbeeld code er eigenlijk zo uit gaat zien:

var displayCustomer = customerList
    .Where((Customer customer) => customer.CustomerID == "xyz123")
    .Select(customer => customer);

En deze code moet nu te begrijpen zijn.

Je ziet het: als je er even naar kijkt, is het op zich vrij logisch. Maar je moet er even aan wennen. Persoonlijk vind ik mijn eerste Linq voorbeeld qua code duidelijker en overzichtelijker dan mijn eerst code-voorbeeld in deze posting.

Volgende keer ga ik kijken naar DLinq, oftewel Linq'en op een database. Het zal je niet verbazen dat dat vrijwel hetzelfde werkt als wat ik je nu heb laten zien.

Tot dan!

PS Mocht je opmerkingen, vragen of iets anders te melden hebben, aarzel dan niet om te reageren, hetzij via het commentaarvakje, hetzij via de mail. Op die manier weet ik of er uberhaupt mensen geinteresseerd zijn in wat ik te melden heb over dit onderwerp.

Feedback

# re: Een eerste blik op LINQ

11/7/2007 9:58 PM by telefonsex
telefonsex

# re: Een eerste blik op LINQ

11/7/2007 9:59 PM by telefonsex
telefonsex

# re: Een eerste blik op LINQ

11/7/2007 10:00 PM by sex
sex

# Sohbet

11/24/2007 1:23 PM by Sohbet
http://www.sohbetiy.com

# Chat

11/24/2007 1:24 PM by Chat
http://www.sohbetiy.com

# Kurtalan

11/30/2007 1:51 PM by Kurtalan
Thanks your..

# SiirtChat

11/30/2007 1:53 PM by SiirtSohbet
Thank your, Good Job!

# re: Een eerste blik op LINQ

1/26/2008 5:33 PM by sohbet
THANGYOU

http://www.trsohbeti.net
http://www.sohbet99.net
http://www.muhabbethane.com
http://www.nesohbet.com
http://www.mirc10.com
http://www.sozsohbet.com
http://oyular.blogspot.com
http://mirctr.blogspot.com

# sohbet

1/29/2008 2:33 PM by sohbet
thanx

# sohbet

1/31/2008 6:52 PM by Sohbet
thanx shadow

# re: Een eerste blik op LINQ

2/23/2008 1:30 PM by Remy
Ik weet niet wat voor een rare reacties er allemaal op dit stukje zeer handige informatie worden gegeven (dat ondertussen al een paar jaartjes oud is), maar ik heb hier heel erg veel aan! Bedankt!

Mvg Remy

# görüntülü sohbet

2/26/2008 5:06 PM by görüntülü sohbet
Death

# Laptop

12/17/2008 7:56 PM by http://laptop-bilgisayar.blogspot.com/
http://okeyindirr.blogspot.com/
http://bedavaklipindir.blogspot.com/
http://zayiflatma.blogspot.com/
http://saglikliguzellik.blogspot.com/
http://quality-video.blogspot.com/
http://fullmp3dinle.blogspot.com/
http://kanserin-tedavileri.blogspot.com/
http://mpler.blogspot.com/
http://bedava--lig-tv.blogspot.com/
http://laptop-bilgisayar.blogspot.com/
http://www.siirbahcesi.net/
http://www.yenimp3ara.org/
http://indirklipizle.blogcu.com/

# adult ateşli videolar

1/4/2009 7:49 PM by adult ateşli vieolar
http://okeyindirr.blogspot.com/
http://bedavaklipindir.blogspot.com/
http://zayiflatma.blogspot.com/
http://saglikliguzellik.blogspot.com/
http://quality-video.blogspot.com/
http://fullmp3dinle.blogspot.com/
http://kanserin-tedavileri.blogspot.com/
http://mpler.blogspot.com/
http://bedava--lig-tv.blogspot.com/
http://laptop-bilgisayar.blogspot.com/
http://www.siirbahcesi.net/
http://www.yenimp3ara.org/
http://indirklipizle.blogcu.com/

# re: Een eerste blik op LINQ

7/8/2009 10:57 AM by Introducing C# 3 – Part 4 This is the forth of a s
Introducing C# 3 – Part 4
This is the forth of a series of articles exploring new features in C# 3. The first three have covered:
Implicitly typed variables and arrays
Extension methods and lambda expressions
Object and collection initializers and anonymous types
To understand this part you should have read the previous three parts of the series, since we will be drawing on features described in all of them.

Introducing Linq
Linq is short for Language Integrated Query. If you are used to using SQL to query databases, you are going to have something of a head start with Linq, since they have many ideas in common. Before we dig into Linq itself, let's step back and look at what makes SQL different from C#.

Imagine we have a list of orders. For this example, we will imagine they are stored in memory, but they could be in a file on disk too. We want to get a list of the costs of all orders that were placed by the customer identified by the number 84. If we set about implementing this in C# before version 3 and a range of other popular languages, we would probably write something like (assuming C# syntax for familiarity):
List<double> Found = new List<double>();
foreach (Order o in Orders)
if (o.CustomerID == 84)
Found.Add(o.Cost);
Here we are describing how to achieve the result we want by breaking the task into a series of instructions. This approach, which is very familiar to us, is called imperative programming. It relies on us to pick a good algorithm and not make any mistakes in the implementation of it; for more complex tasks, the algorithm is more complex and our chances of implementing it correctly decrease.

If we had the orders stored in a table in a database and we used SQL to query it, we would write something like:
SELECT Cost FROM Orders WHERE CustomerID = 84
Here we have not specified an algorithm, or how to get the data. We have just declared what we want and left the computer to work out how to do it. This is known as declarative or logic programming.

Linq brings declarative programming features into imperative languages. It is not language specific, and has been implemented in the Orcas version of VB.Net amongst other languages. In this series we are focusing on C# 3.0, but the principles will carry over to other languages.

Understanding A Simple Linq Query
Let's jump straight into a code example. First, we'll create an Order class, then make a few instances of it in a List as our test data. With that done, we'll use Linq to get the costs of all orders for customer 84.
class Order
{
private int _OrderID;
private int _CustomerID;
private double _Cost;
public int OrderID
{
get { return _OrderID; }
set { _OrderID = value; }
}
public int CustomerID
{
get { return _CustomerID; }
set { _CustomerID = value; }
}
public double Cost
{
get { return _Cost; }
set { _Cost = value; }
}
}
class Program
{
static void Main(string[] args)
{
// Set up some test orders.
var Orders = new List<Order> {
new Order {
OrderID = 1,
CustomerID = 84,
Cost = 159.12
},
new Order {
OrderID = 2,
CustomerID = 7,
Cost = 18.50
},
new Order {
OrderID = 3,
CustomerID = 84,
Cost = 2.89
}
};
// Linq query.
var Found = from o in Orders
where o.CustomerID == 84
select o.Cost;

// Display results.
foreach (var Result in Found)
Console.WriteLine("Cost: " + Result.ToString());
}
}
The output of running this program is:
Cost: 159.12
Cost: 2.89
Let's walk through the Main method. First, we use collection and object initializers to create a list of Order objects that we can run our query over. Next comes the query - the new bit. We declare the variable Found and request that its type be inferred for us by using the "var" keyword.

We then run across a new C# 3.0 keyword: "from".
from o in Orders
This is the keyword that always starts a query. You can read it a little bit like a "foreach": it takes a collection of some kind after the "in" keyword and makes what is to the left of the "in" keyword refer to a single element of the collection. Unlike "foreach", we do not have to write a type.

Following this is another new keyword: "where".
where o.CustomerID == 84
This introduces a filter, allowing us to pick only some of the objects from the Orders collection. The "from" made the identifier "o" refer to a single item from the collection, and we write the condition in terms of this. If you type this query into the IDE yourself, you will notice that it has worked out that "o" is an Order and intellisense works as expected.

The final new keyword is "select".
select o.Cost
This comes at the end of the query and is a little like a "return" statement: it states what we want to appear in the collection holding the results of the query. As well as primitive types (such as int), you can instantiate any object you like here. In this case, we will end up with Found being a List<int>, though.

You may be thinking at this point, "hey, this looks like SQL but kind of backwards and twisted about a bit". That is a pretty good summary. I suspect many who have written a lot of SQL will find the "select comes last" a little grating at first; the other important thing to remember is that all of the conditions are to be expressed in C# syntax, not SQL syntax. That means "==" for equality testing, rather than "=" in SQL. Thankfully, in most cases that mistake will lead to a compile time error anyway.

A Few More Simple Queries
We may wish our query to return not only the Cost, but also the OrderID for each result that it finds. To do this we take advantage of anonymous types.
var Found = from o in Orders
where o.CustomerID == 84
select new { OrderID = o.OrderID, Cost = o.Cost };
Here we have defined an anonymous type that holds an OrderID and a Cost. This is where we start to see the power and flexibility that they offer; without them we would need to write custom classes for every possible set of results we wanted. Remembering the projection syntax, we can shorten this to:
var Found = from o in Orders
where o.CustomerID == 84
select new { o.OrderID, o.Cost };
And obtain the same result. Note that you can perform whatever computation you wish inside the anonymous type initializer. For example, we may wish to return the Cost of the order with an additional sales tax of 10% added on to it.
var Found = from o in Orders
where o.CustomerID == 84
select new {
o.OrderID,
o.Cost,
CostWithTax = o.Cost * 1.1
};
Conditions can be more complex too, and are built up in the usual C# way, just as you would do in an "if" statement. Here we apply an extra condition that we only want to see orders valued over a hundred pounds.
var Found = from o in Orders
where o.CustomerID == 84 && o.Cost > 100
select new {
o.OrderID,
o.Cost,
CostWithTax = o.Cost * 1.1
};


Ordering
It is possible to sort the results based upon a field or the result of a computation involving one or more fields. This is achieved by using the new "orderby" keyword.
var Found = from o in Orders
where o.CustomerID == 84
orderby o.Cost ascending
select new { o.OrderID, o.Cost };
After the "orderby" keyword, we write the expression that the objects will be sorted on. In this case, it is a single field. Notice this is different from SQL, where there are two words: "ORDER BY". I have added the keyword "ascending" at the end, though this is actually the default. The result is that we now get the orders in order of increasing cost, cheapest to most expensive. To get most expensive first, we would have used the "descending" keyword.

While I said earlier that the ordering condition is based on fields in the objects involved in the query, it actually doesn't have to be. Here's a way to get the results in a random order.
Random R = new Random();
var Found = from o in Orders
where o.CustomerID == 84
orderby R.Next()
select new { OrderID = o.OrderID, Cost = o.Cost };


Joins
So far we have just had one type of objects to run our query over. However, real life is usually more complex than this. For this example, let's introduce another class named Customer.
class Customer
{
private int _CustomerID;
private string _Name;
private string _Email;
public int CustomerID
{
get { return _CustomerID; }
set { _CustomerID = value; }
}
public string Name
{
get { return _Name; }
set { _Name = value; }
}
public string Email
{
get { return _Email; }
set { _Email = value; }
}
}
In the Main method, we will also instantiate a handful of Customer objects and place them in a list.
var Customers = new List<Customer> {
new Customer {
CustomerID = 7,
Name = "Emma",
Email = "emz0r@worreva.com"
},
new Customer {
CustomerID = 84,
Name = "Pedro",
Email = "pedro@cerveza.es"
},
new Customer {
CustomerID = 102,
Name = "Vladimir",
Email = "vladimir@pivo.ru"
}
};
We would like to produce a list featuring all orders, stating the ID and cost of the order along with the name of the customer. To do this we need to involve both the List of orders and the List of customers in our query. This is achieved using the "join" keyword. Let's replace our query and output code with the following.
// Query.
var Found = from o in Orders
join c in Customers on o.CustomerID equals c.CustomerID
select new { c.Name, o.OrderID, o.Cost };
// Display results.
foreach (var Result in Found)
Console.WriteLine(Result.Name + " spent " +
Result.Cost.ToString() + " in order " +
Result.OrderID.ToString());
The output of running this program is:
Pedro spent 159.12 in order 1
Emma spent 18.5 in order 2
Pedro spent 2.89 in order 3
We use the "join" keyword to indicate that we want to refer to another collection in our query. We then once again use the "in" keyword to declare an identifier that will refer to a single item in the collection; in this case it has been named "c". Finally, we need to specify how the two collections are related. This is achieved using the "on ... equals ..." syntax, where we name a field from each of the collections. In this case, we have stated that the CustomerID of an Order maps to the CustomerID of a Customer.

When the query is evaluated, an object in the Customers collection is located to match each object in the Orders collection. Note that if there were many customers with the same ID, there may be more than one matching Customer object per Order object. In this case, we get extra results. For example, change Vladimir to also have an OrderID of 84. The output of the program would then be:
Pedro spent 159.12 in order 1
Vladimir spent 159.12 in order 1
Emma spent 18.5 in order 2
Pedro spent 2.89 in order 3
Vladimir spent 2.89 in order 3
Notice that Vladimir never featured in the results before, since he had not ordered anything.

Getting All Permutations With Multiple "from"s
It is possible to write a query that gets every combination of the objects from two collections. This is achieved by using the "from" keyword multiple times.
var Found = from o in Orders
from c in Customers
select new { c.Name, o.OrderID, o.Cost };
Earlier I suggested that you could think of "from" as being a little bit like a "foreach". You can also think of multiple uses of "from" a bit like nested "foreach" loops; we are going to get every possible combination of the objects from the two collections. Therefore, the output will be:
Emma spent 159.12 in order 1
Pedro spent 159.12 in order 1
Vladimir spent 159.12 in order 1
Emma spent 18.5 in order 2
Pedro spent 18.5 in order 2
Vladimir spent 18.5 in order 2
Emma spent 2.89 in order 3
Pedro spent 2.89 in order 3
Vladimir spent 2.89 in order 3
Which is not especially useful. You may have spotted that you could have used "where" in conjunction with the two "from"s to get the same result as the join:
var Found = from o in Orders
from c in Customers
where o.CustomerID == c.CustomerID
select new { c.Name, o.OrderID, o.Cost };
However, don't do this, since it computes all of the possible combinations before the "where" clause, which goes on to throw most of them away. This is a waste of memory and computation. A join, on the other hand, never produces them in the first place.

Grouping
Another operations that you may wish to perform is categorizing objects that have the same value in a given field. For example, we might want to categorize orders by CustomerID. The result we expect back is a list of groups, where each group has a key (in this case, the CustomerID) and a list of matching objects. Here's the code to do the query and output the results.
// Group orders by customer.
var OrdersByCustomer = from o in Orders
group o by o.CustomerID;
// Iterate over the groups.
foreach (var Cust in OrdersByCustomer)
{
// About the customer...
Console.WriteLine("Customer with ID " + Cust.Key.ToString() +
" ordered " + Cust.Count().ToString() + " items.");
// And what they ordered.
foreach (var Item in Cust)
Console.WriteLine(" ID: " + Item.OrderID.ToString() +
" Cost: " + Item.Cost.ToString());
}
The output that it produces is as follows:
Customer with ID 84 ordered 2 items.
ID: 1 Cost: 159.12
ID: 3 Cost: 2.89
Customer with ID 7 ordered 1 items.
ID: 2 Cost: 18.5
This query looks somewhat different to the others that we have seen so far in that it does not end with a "select". The first line is the same as we're used to. The second introduces the new "group" and "by" keywords. After the "by" we name the field that we are going to group the objects by. Before the "by" we put what we would like to see in the resulting per-group collections. In this case, we write "o" so as to get the entire object. If we had only been interested in the Cost field, however, we could have written:
// Group orders by customer.
var OrdersByCustomer = from o in Orders
group o.Cost by o.CustomerID;
// Iterate over the groups.
foreach (var Cust in OrdersByCustomer)
{
// About the customer...
Console.WriteLine("Customer with ID " + Cust.Key.ToString() +
" ordered " + Cust.Count().ToString() + " items.");
// And the costs of what they ordered.
foreach (var Cost in Cust)
Console.WriteLine(" Cost: " + Cost.ToString());
}
Which produces the output:
Customer with ID 84 ordered 2 items.
Cost: 159.12
Cost: 2.89
Customer with ID 7 ordered 1 items.
Cost: 18.5
You are not restricted to just a single field or the object itself; you could, for example, instantiate an anonymous type there instead.

Query Continuations
At this point you might be wondering if you can follow a "group ... by ..." with a "select". The answer is yes, but not directly. Both "group ... by ..." and "select" are special in so far as they produce a result. You must terminate a Linq query with one or the other. If you try to do something like:
var CheapOrders = from o in Orders
where o.Cost < 10;
Then it will lead to a compilation error. Since both "select" and "group ... by ..." terminate a query, you need a way of taking the results and using them as the input to another query. This is called a query continuation, and the keyword for this is "into".

In the following example we take the result of grouping orders by customer and then use a select to return an anonymous type containing the CustomerID and the number of orders that the customer has placed.
var OrderCounts = from o in Orders
group o by o.CustomerID into g
select new {
CustomerID = g.Key,
TotalOrders = g.Count()
};
Notice the identifier "g", which we introduce after the keyword "into". This identifier represents an item in the collection containing the results of the previous query. We use in the select statement. Remember that each element of the collection we are querying in this second query is actually a collection itself, since this is what "group ... by ..." produces. Therefore, we can call Count() on it to get the number of elements, which is the number of orders per customer. We grouped by the CustomerID field, so that is our Key.

Query continuations can be used to chain together as many selection and grouping queries as you need in whatever order you need.

Under The Hood
Now we have looked at the practicalities of using Linq, I am going to spend a little time taking a look at how it works. Don't worry if you don't understand everything in this section, it's here for those who like to dig a little deeper.

Throughout the series I have talked about how all of the language features introduced in C# 3.0 somehow help to make Linq possible. While anonymous types have shown up pretty explicitly and you can see from the lack of type annotations we have been writing that there is some type inference going on, where are the extension methods and lambda expressions?

There's a principle in language design and implementation called "syntactic sugar". We use this to describe cases where certain syntax isn't directly compiled, but is first transformed into some other more primitive syntax and then passed to the compiler. This is exactly what happens with Linq: your queries are transformed into a sequence of method calls and lambda expressions.

The C# 3.0 specification goes into great detail about these transformations. In practice, you probably don't need to know about this, but let's look at one example to help us understand what is going on. Our simple query from earlier:
var Found = from o in Orders
where o.CustomerID == 84
select o.Cost;
After transformation by the compiler, becomes:
var Found = Orders.Where(o => o.CustomerID == 84)
.Select(o => o.Cost);
And this is what actually gets compiled. Here the use of lambda expressions becomes clear. The lambda passed to the Where method is called on each element of Orders to determine whether it should be in the result or not. This produces another intermediate collection, which we then call the Select method on. This calls the lambda it is passed on each object and builds up a final collection of the results, which is then assigned to Found. Beautiful, huh?

Finally, a note on extension methods. Both Where and Select, along with a range of other methods, have been implemented as extension methods. The type they use for "this" is IEnumerable, meaning that any collection that implements that interface can be used with Linq. Without extension methods, it would not have been possible to achieve this level of code re-use.

DLinq and XLinq
In this article I have demonstrated Linq working with objects instantiated from classes that we implemented ourselves and stored in built-in collection classes that implement IEnumerable. However, the query syntax compiles down to calls on extension methods. This means that it is possible to write alternative implementations of Linq that follow the same syntax but perform different operations.

Two examples of this, which will ship with C# 3.0, are DLinq and XLinq. DLinq enables the same language integrated query syntax to do queries on databases by translating the Linq into SQL. XLinq enables queries on XML documents.

Conclusion
Linq brings declarative programming to the C# language and will refine and unify the way that we work with objects, databases, XML and whatever anyone else writes the appropriate extension methods for. It builds upon the language features that we have already seen in the previous parts of the series, but hiding some of them away under syntactic sugar. While the query language has a range of differences to SQL, there are enough similarities to make knowledge of SQL useful to those who know it. However, its utility is far beyond providing yet another way to work with databases.

Closing Thoughts On C# 3.0
This brings us to the end of this four part series on C# 3.0. Here is a quick recap on all that we have seen.
Type inference removes much of the tedium of writing out type annotations again and again.
Lambda expressions make higher order programming syntactically light.
Extension methods provide another path to better code re-use when correctly applied.
Object and collection initializers along with anonymous types make building up large data structures much less effort.
Linq gives us declarative programming abilities over objects, databases and XML documents.
When I saw C# 1.0 I highly doubted that C# was going to be a language I would ever be excited about. I have been pleasantly surprised, and writing this series has been a lot of fun. I hope that it has been informative and enjoyable to read, and that it will help you to make powerful use of the new language features. I greatly look forward to being able to use them in my own day-to-day development and seeing how other people use them.

Of course, knowing about something and doing it yourself are two entirely different things; if you haven't already done so, grab yourself the Visual Studio 2008 trial or the free Express Edition. Only then will you become comfortable with the new features and be able to use them effectively in your own development. Happy hacking, and have fun!

# re: Een eerste blik op LINQ

7/8/2009 10:58 AM by xxxxxx
<html>

<head></head>

<body>
<b>test</b>
</body>

</html>

# re: Een eerste blik op LINQ

7/8/2009 11:00 AM by xxxxxx

Dennis' Blog
Avonturen in .NET
posts - 37, comments - 268, trackbacks - 0, articles - 0
My Links
Home
Contact

Login
Archives
March, 2006 (1)
February, 2006 (6)
January, 2006 (3)
November, 2005 (1)
October, 2005 (7)
September, 2005 (19)
Post Categories
C#
From the trenches
PDC
Security
Visual Studio 2005 Team System
Image Galleries
dotNED
Bloggers
Hassan Fadili
Michiel van Otegem
Peter van Ooijen
Misc
Detrio
dotNED, De Nederlandse .net gebruikersgroep
Een eerste blik op LINQ
Posted on Thursday, November 10, 2005 10:10 PM
Het is alweer enige tijd geleden dat ik iets over C# 3.0 geschreven heb, maar dat ga ik nu (min of meer) goedmaken. Ik vervolg deze serie nu met een aantal artikelen over een van de toepassingen van de nieuwe mogelijkheden: Linq.

Linq staat voor Language Integrated Query. Zoals de naam al aangeeft geeft ons dat de mogelijkheid om in de taal (in dit geval C# maar VB.Net kan er ook mee overweg) queries te definieren. Het verhaal achter het ontstaan van Linq zal ik hier even kort schetsen, zodat je een beeld hebt wat de geschiedenis is.

Neem eens een stuk code dat je recentelijk geschreven hebt. Kijk er eens goed naar en ga dan kijken hoe vaak je in die code "zoekt" naar zaken. Denk bijvoorbeeld aan het doorlopen van een ArrayList instance met daarin Customer objecten. Regelmatig schrijf je code die in die lijst op zoek gaat naar alle klanten die nog een betaling open hebben staan. Of je wilt een overzicht van alle klanten in je lijst die aangegeven hebben dat ze informatie per email willen ontvangen. Of je wilt simpelweg in die lijst op zoek gaan naar die ene klant met klantnummer 'xyz123' zodat je de gegevens daarvan op het scherm kunt tonen. Als je goed kijkt, zul je zien dat het zoeken naar gegevens in lijsten (in wat voor vorm dan ook) best vaak voorkomt.

Echter, een goede methode om te zoeken is er niet. Neem de volgende code eens:

// Initializeer de boel
Customer displayCustomer = null;
bool bFound = false;
int counter = 0;

// Zoek de juiste klant
while( (!bFound) && (counter < customerList.Count) ) {
displayCustomer = (Customer)customerList[counter];
if( displayCustomer.CustomerID == "xyz123" ) {
bFound = true;
}
counter++;
}

if( bFound ) {
// Laat zien
} else {
// Geef foutmelding
}

// Enzovoorts...

Ik weet het, deze code kan beter. Je kunt natuurlijk een specifieke CustomerList type definieren, met daarin de juiste zoekcode. Maar die zal er niet echt anders uitzien dan bovenstaande code.

Zoeken is behoorlijk belangrijk de meeste, serieuze applicaties. Er zijn vele voorbeelden te verzinnen: zoeken naar de inlognaam van de gebruiker om zijn of haar wachtwoord te controleren, zoeken naar de bestanden in de plugin-directory, zoeken naar de geinstalleerde printers op het systeem, zoeken naar.. affijn, je snapt het wel.

Zoeken gebeurdt uiteraard ook in databases. Da's mooi, zul je denken, want daar hoef ik niet zo veel voor te doen. Alles wat ik moet doen is de juiste SQL code schrijven en de database regelt het zelf wel. Maar heb je je wel eens gerealiseerd dat dat eigenlijk een hele vreemde constructie oplevert? Je schrijft hele mooie, goed gedocumenteerde, door de compiler op alle details gecontroleerde C# of VB.Net code, vervolgens plak je daar een string (!!!) in met daarin een stuk code in een hele andere taal, namelijk SQL. Denk daar eens over na: in onze code staat opeens een niet te controleren, niet te compileren en dus niet te verifieren string met een andere programmeertaal daarin. Vreemd, vind je niet?

Als je nu veel met XML werkt (en wie doet dat tegenwoordig niet?) dan krijg je te maken met weer een hele andere manier van zoeken in data. Nu kun je met XQuery of XPath aan de gang gaan, of je itereert zelf over de elementen in je XML document heen en goet alles zelf.

Zoeken, zoeken en zoeken. We doen het nogal eens in onze applicatie, op heel veel verschillende en elkaar min of meer tegensprekende methodes. Om daar nu wat aan te doen, is het Project Linq geboren. Het idee hierachter is: laten we alle mogelijke manieren van zoeken (querien in slecht nederlands) nu eens onder de loep nemen en daar een uniforme, strongly typed, verifieerbare en compileerbare methode voor verzinnen. En dat hebben ze gedaan.

Al gauw bleek dat dat niet zo eenvoudig was en om dat op een goede manier te doen moest de taal C# en VB.Net aangepast worden. Welke aanpassingen dat zijn, heb je in mijn vorige postings kunnen lezen (ja ja, er zat een lijn in het verhaal!). Met die uitbreidingen is Linq mogelijk geworden. Ik zal nog even op een rijtje zetten welke nieuwe mogelijkheden er komen:

Type inferrence (var q = ....)

Extension methods

Initializers

Anonymous types

Lambda expressions

Met dit alles kunnen we bovenstaande code anders gaan schrijven, op een manier die ons behoorlijk bekend voor zal komen:


var displayCustomer = from customer in customerList
where customer.CustomerID == "xyz123"
select customer;

if (displayCustomer != null)
{
// Laat zien
}
else
{
// Geef foutmelding
}

En dit doet dus precies hetzelfde...

Laat je niet verwarren door de rare plaatsing van 'select', dit leg ik nog wel uit. Maar afgezien daarvan is dit 'gewoon' SQL in C# syntax. De enige aanpassing die ik gedaan heb is dat customerList nu geen ArrayList meer is maar een List<Customer>. Dat maakt echter voor mijn verhaal niets uit.

Laten we eens kijken hoe dit nou kan.

Je moet weten dat de namespace System.Query (waar Linq in is gedefnieerd) voornamelijk bestaat uit een aantal extension methods op het type IEnumerable<T>. Met andere woorden: alles wat de interface IEnumerable<T> implementeert heeft een aantal extra methods gekregen. Een van die methods is bijvoorbeeld Where(); Die zit er als volgt uit:

IEnumerable<T> IEnumerable.Where<T>((T) => bool : predicate)

Met andere woorden: de method Where heeft als resultaat een IEnumerable<T> en als argument de lambda expression (T) => bool: predicate, oftewel er wordt een anonymous method gemaakt die een bool terug geeft. Dus als we dat even toepassen op onze customerList gaat dat er als volgt uitzien:

var resultList = customerList.Where( (Customer c) => c.CustomerID == "xyz123" );

Vertaling: neem onze List<Customer> customerList (welke IEnumerable<Customer> implementeert). Voer daar de 'Where' method op uit. In die Where method geven we mee de lambda expressie (nogmaals, lees mijn vorige postings over dit onderwerp om te begrijpen wat dat precies is) (Customer c) => c.CustomerID == "xyz123" . Er wordt nu dus een anonymous method gedefnieerd die voor iedere Customer instance in de lijst kijkt naar de CustomerID en die vergelijkt met "xyz123". Daar komt een bool uit (true of false) en als hij true is, dan wordt die Customer instance aan de nieuwe resultList toegevoegd. Overigens is resultList ook een class die IEnumerable<T> implementeert....

Kijk hier nog eens goed naar, laat het even bezinken. Ik wacht wel even.

Goed. Het resultaat is dus een IEnumerable<T>. Daarop kunnen we dan weer andere extension methods toepassen, welke bijna allemaal een IEnumerable<T> terug geven. We kunnen dus een hele rij van dit soort methods aanroepen: Lijst.Where().Where().GroupBy().Select(); Anders weergegeven:

Lijst.Where().
Where().
GroupBy().
Select();


Nou hebben we net gezien in mijn voorbeeld dat we helemaal geen IEnumerable<T>.Where() method gebruiken. Nee, we roepen gewoon from type x in lijst where x.iets == "bla" select x.ID; of zo iets dergelijks. De reden dat dat werkt is door het gebruik van Expression Trees. Dat is wellicht iets voor andere posting, maar neem nu maar even van me aan dat dat er voor zorgt dat onze mooie, SQL-achtige syntax verandert in die reeks van method calls en dat alle code achter bijvoorbeeld de where vertaalt wordt in een lambda expressie. Moeilijk is dat niet, het is een kwestie van haakjes en dergelijke toevoegen.

Dat betekent dat onze eerste voorbeeld code er eigenlijk zo uit gaat zien:

var displayCustomer = customerList
.Where((Customer customer) => customer.CustomerID == "xyz123")
.Select(customer => customer);

En deze code moet nu te begrijpen zijn.

Je ziet het: als je er even naar kijkt, is het op zich vrij logisch. Maar je moet er even aan wennen. Persoonlijk vind ik mijn eerste Linq voorbeeld qua code duidelijker en overzichtelijker dan mijn eerst code-voorbeeld in deze posting.

Volgende keer ga ik kijken naar DLinq, oftewel Linq'en op een database. Het zal je niet verbazen dat dat vrijwel hetzelfde werkt als wat ik je nu heb laten zien.

Tot dan!

PS Mocht je opmerkingen, vragen of iets anders te melden hebben, aarzel dan niet om te reageren, hetzij via het commentaarvakje, hetzij via de mail. Op die manier weet ik of er uberhaupt mensen geinteresseerd zijn in wat ik te melden heb over dit onderwerp.

Feedback

# re: Een eerste blik op LINQ
5/26/2007 11:10 PM by sohbet
http://www.kitlen.com
http://kitlen.com/ruya-tabirleri.htm
http://kitlen.com/video.htm
http://kitlen.com/ask_sevgi.htm
http://kitlen.com/flash_oyunlar.htm
http://kitlen.com/sohbet.php

http://sohbet.kitlen.com
http://www.kodes.com
http://irc.kitlen.com
http://kitlen.com/yonja.php

Thank you
# re: Een eerste blik op LINQ
11/7/2007 9:58 PM by telefonsex
telefonsex
# re: Een eerste blik op LINQ
11/7/2007 9:59 PM by telefonsex
telefonsex
# re: Een eerste blik op LINQ
11/7/2007 10:00 PM by sex
sex
# Sohbet
11/24/2007 1:23 PM by Sohbet
http://www.sohbetiy.com">http://www.sohbetiy.com
# Chat
11/24/2007 1:24 PM by Chat
http://www.sohbetiy.com">http://www.sohbetiy.com
# Kurtalan
11/30/2007 1:51 PM by Kurtalan
Thanks your..
# SiirtChat
11/30/2007 1:53 PM by SiirtSohbet
Thank your, Good Job!
# re: Een eerste blik op LINQ
1/26/2008 5:33 PM by sohbet
THANGYOU

http://www.trsohbeti.net
http://www.sohbet99.net
http://www.muhabbethane.com
http://www.nesohbet.com
http://www.mirc10.com
http://www.sozsohbet.com
http://oyular.blogspot.com
http://mirctr.blogspot.com
# re: Een eerste blik op LINQ
1/29/2008 11:26 AM by Sohbet Video Youtube
http://www.sohbetseli.net
http://sohbetseli.net/ruya-tabirleri.htm
http://sohbetseli.net/guzelsozler.htm
http://sohbetseli.net/ask_sevgi.htm
http://sohbetseli.net/flash_oyunlar.htm
http://sohbetseli.net/sohbet.php
http://arsiv.sohbetseli.net
http://oyun.sohbetseli.net
http://program.sohbetseli.net
http://sex-hikayeleri.sohbetseli.net
http://sexhikayeleri.sohbetseli.net
http://sarkisozleri.sohbetseli.net
http://fikra.sohbetseli.net
http://ruyatabirleri.sohbetseli.net
http://www.sohbet4.com
http://www.youtube-tr.net
http://www.sohbet-turk.com
http://www.asksohbet.gen.tr
# sohbet
1/29/2008 2:33 PM by sohbet
thanx
# sohbet
1/31/2008 6:52 PM by Sohbet
thanx shadow
# re: Een eerste blik op LINQ
2/7/2008 7:19 PM by mirc
Thanks Best Regards
# re: Een eerste blik op LINQ
2/7/2008 7:25 PM by mirc
Thanks Best Regards
http://www.turkiyemirc.org/">http://www.turkiyemirc.org/
http://www.turkiyemirc.org/">http://www.turkiyemirc.org/forum
http://www.turkiyemirc.org/">http://www.turkiyemirc.org/forum/
http://www.turkiyemirc.org/">http://www.turkiyemirc.org/chat/
http://www.turkiyemirc.org/">http://www.turkiyemirc.org/muhabbet/
http://www.karar.org">http://www.karar.org
http://www.karar.org">http://www.karar.org/forum/
http://www.karar.org">http://www.karar.org/sohbet/
http://www.turkada.net/">http://www.turkada.net/
http://www.turkada.net/">http://www.turkada.net/forum/
http://www.sohbettr.gen.tr">http://www.sohbettr.gen.tr
http://www.sohbettr.gen.tr">http://www.sohbettr.gen.tr/toplist/
http://www.mirc-turk.gen.tr/">http://www.mirc-turk.gen.tr/
# re: Een eerste blik op LINQ
2/7/2008 7:41 PM by mirc
Thanks Best Regards
http://www.turkiyemirc.org/">http://www.turkiyemirc.org/
http://www.turkiyemirc.org/">http://www.turkiyemirc.org/forum
http://www.turkiyemirc.org/">http://www.turkiyemirc.org/forum/
http://www.turkiyemirc.org/">http://www.turkiyemirc.org/chat/
http://www.turkiyemirc.org/">http://www.turkiyemirc.org/muhabbet/
http://www.karar.org">http://www.karar.org
http://www.karar.org">http://www.karar.org/forum/
http://www.karar.org">http://www.karar.org/sohbet/
http://www.turkada.net/">http://www.turkada.net/
http://www.turkada.net/">http://www.turkada.net/forum/
http://www.sohbettr.gen.tr">http://www.sohbettr.gen.tr
http://www.sohbettr.gen.tr">http://www.sohbettr.gen.tr/toplist/
http://www.mirc-turk.gen.tr/">http://www.mirc-turk.gen.tr/
# re: Een eerste blik op LINQ
2/23/2008 1:30 PM by Remy
Ik weet niet wat voor een rare reacties er allemaal op dit stukje zeer handige informatie worden gegeven (dat ondertussen al een paar jaartjes oud is), maar ik heb hier heel erg veel aan! Bedankt!

Mvg Remy
# görüntülü sohbet
2/26/2008 5:06 PM by görüntülü sohbet
Death
# re: Een eerste blik op LINQ
6/3/2008 1:17 PM by porno izle
http://www.sexizlee.com
http://www.sexizleyin.com
http://www.forumsayfam.com
http://www.multiadult.com
http://www.pornsayfam.com
http://www.sicakblog.com
http://www.atesliblog.com
http://www.pornvideolar.com
http://www.hotizle.com
http://www.tubesexy.net
http://www.ateslifilmler.com
http://www.sexisayfa.com
http://www.sicakoyun.com
http://www.ateslitube.com
http://www.atesliporno.com
http://www.sexysayfa.com
http://www.atesliizle.com
http://www.sicakfilmler.com
http://www.ateslierotik.com
http://www.erotikciler.com
http://www.yetiskinvideo.com
http://www.hikayesayfam.com
http://www.89movie1.com
http://www.8adult.com
http://www.tubeporn1.com
http://www.sexywomanz.com
http://www.bikinisexy.net
http://www.freepornsexy.net
http://www.fierytube.com
http://www.sicaksayfa.com
http://www.adultsayfa.com
http://www.ateslifilm.com
http://www.yetiskinvideo.net
http://www.yetiskinvideo.org
http://www.yetiskinvideolar.com
http://www.yetiskinvideolar.net

http://www.oyunf.com
http://www.theoyun.net
http://www.oyunh.com
http://www.videosayfam.com
http://www.videosayfam.net
http://www.forumsayfam.net
http://www.mixarticle.com
http://www.indirmedenizle.net
http://www.videosayfan.com
http://www.vidfull.com
http://www.videolar1.com
http://www.videop.net
http://www.videolar1.net
http://www.videolarz.com
http://www.videolarz.net
http://www.videolars.com
http://www.utubem.com
http://www.izlenix.com
http://www.izlemeyeri.com
http://www.izlematic.com

http://forumsayfam.blogspot.com
http://yenioyunlaroyun.blogspot.com
http://yemekoyunlarioyna.blogspot.com
http://kizoyunlarioyna.blogspot.com
http://makyajyapoyunu.blogspot.com
http://oyunlaroyunu.blogspot.com
http://atesli-film.blogspot.com
http://fovermix.blogspot.com
http://newscelebrityy.blogspot.com
# Laptop
12/17/2008 7:56 PM by http://laptop-bilgisayar.blogspot.com/">http://laptop-bilgisayar.blogspot.com/">http://laptop-bilgisayar.blogspot.com/">http://laptop-bilgisayar.blogspot.com/
http://okeyindirr.blogspot.com/">http://okeyindirr.blogspot.com/
http://bedavaklipindir.blogspot.com/">http://bedavaklipindir.blogspot.com/
http://zayiflatma.blogspot.com/">http://zayiflatma.blogspot.com/
http://saglikliguzellik.blogspot.com/">http://saglikliguzellik.blogspot.com/
http://quality-video.blogspot.com/">http://quality-video.blogspot.com/
http://fullmp3dinle.blogspot.com/">http://fullmp3dinle.blogspot.com/
http://kanserin-tedavileri.blogspot.com/">http://kanserin-tedavileri.blogspot.com/
http://mpler.blogspot.com/">http://mpler.blogspot.com/
http://bedava--lig-tv.blogspot.com/">http://bedava--lig-tv.blogspot.com/
http://laptop-bilgisayar.blogspot.com/">http://laptop-bilgisayar.blogspot.com/">http://laptop-bilgisayar.blogspot.com/">http://laptop-bilgisayar.blogspot.com/
http://www.siirbahcesi.net/">http://www.siirbahcesi.net/
http://www.yenimp3ara.org/">http://www.yenimp3ara.org/
http://indirklipizle.blogcu.com/">http://indirklipizle.blogcu.com/
# adult atesli videolar
1/4/2009 7:49 PM by adult atesli vieolar
http://okeyindirr.blogspot.com/">http://okeyindirr.blogspot.com/
http://bedavaklipindir.blogspot.com/">http://bedavaklipindir.blogspot.com/
http://zayiflatma.blogspot.com/">http://zayiflatma.blogspot.com/
http://saglikliguzellik.blogspot.com/">http://saglikliguzellik.blogspot.com/
http://quality-video.blogspot.com/">http://quality-video.blogspot.com/
http://fullmp3dinle.blogspot.com/">http://fullmp3dinle.blogspot.com/
http://kanserin-tedavileri.blogspot.com/">http://kanserin-tedavileri.blogspot.com/
http://mpler.blogspot.com/">http://mpler.blogspot.com/
http://bedava--lig-tv.blogspot.com/">http://bedava--lig-tv.blogspot.com/
http://laptop-bilgisayar.blogspot.com/">http://laptop-bilgisayar.blogspot.com/">http://laptop-bilgisayar.blogspot.com/">http://laptop-bilgisayar.blogspot.com/
http://www.siirbahcesi.net/">http://www.siirbahcesi.net/
http://www.yenimp3ara.org/">http://www.yenimp3ara.org/
http://indirklipizle.blogcu.com/">http://indirklipizle.blogcu.com/
# re: Een eerste blik op LINQ
2/13/2009 4:51 PM by sohbet
http://www.sohbetmetro.com
# re: Een eerste blik op LINQ
7/8/2009 10:57 AM by Introducing C# 3 – Part 4 This is the forth of a s
Introducing C# 3 – Part 4
This is the forth of a series of articles exploring new features in C# 3. The first three have covered:
Implicitly typed variables and arrays
Extension methods and lambda expressions
Object and collection initializers and anonymous types
To understand this part you should have read the previous three parts of the series, since we will be drawing on features described in all of them.

Introducing Linq
Linq is short for Language Integrated Query. If you are used to using SQL to query databases, you are going to have something of a head start with Linq, since they have many ideas in common. Before we dig into Linq itself, let's step back and look at what makes SQL different from C#.

Imagine we have a list of orders. For this example, we will imagine they are stored in memory, but they could be in a file on disk too. We want to get a list of the costs of all orders that were placed by the customer identified by the number 84. If we set about implementing this in C# before version 3 and a range of other popular languages, we would probably write something like (assuming C# syntax for familiarity):
List<double> Found = new List<double>();
foreach (Order o in Orders)
if (o.CustomerID == 84)
Found.Add(o.Cost);
Here we are describing how to achieve the result we want by breaking the task into a series of instructions. This approach, which is very familiar to us, is called imperative programming. It relies on us to pick a good algorithm and not make any mistakes in the implementation of it; for more complex tasks, the algorithm is more complex and our chances of implementing it correctly decrease.

If we had the orders stored in a table in a database and we used SQL to query it, we would write something like:
SELECT Cost FROM Orders WHERE CustomerID = 84
Here we have not specified an algorithm, or how to get the data. We have just declared what we want and left the computer to work out how to do it. This is known as declarative or logic programming.

Linq brings declarative programming features into imperative languages. It is not language specific, and has been implemented in the Orcas version of VB.Net amongst other languages. In this series we are focusing on C# 3.0, but the principles will carry over to other languages.

Understanding A Simple Linq Query
Let's jump straight into a code example. First, we'll create an Order class, then make a few instances of it in a List as our test data. With that done, we'll use Linq to get the costs of all orders for customer 84.
class Order
{
private int _OrderID;
private int _CustomerID;
private double _Cost;
public int OrderID
{
get { return _OrderID; }
set { _OrderID = value; }
}
public int CustomerID
{
get { return _CustomerID; }
set { _CustomerID = value; }
}
public double Cost
{
get { return _Cost; }
set { _Cost = value; }
}
}
class Program
{
static void Main(string[] args)
{
// Set up some test orders.
var Orders = new List<Order> {
new Order {
OrderID = 1,
CustomerID = 84,
Cost = 159.12
},
new Order {
OrderID = 2,
CustomerID = 7,
Cost = 18.50
},
new Order {
OrderID = 3,
CustomerID = 84,
Cost = 2.89
}
};
// Linq query.
var Found = from o in Orders
where o.CustomerID == 84
select o.Cost;

// Display results.
foreach (var Result in Found)
Console.WriteLine("Cost: " + Result.ToString());
}
}
The output of running this program is:
Cost: 159.12
Cost: 2.89
Let's walk through the Main method. First, we use collection and object initializers to create a list of Order objects that we can run our query over. Next comes the query - the new bit. We declare the variable Found and request that its type be inferred for us by using the "var" keyword.

We then run across a new C# 3.0 keyword: "from".
from o in Orders
This is the keyword that always starts a query. You can read it a little bit like a "foreach": it takes a collection of some kind after the "in" keyword and makes what is to the left of the "in" keyword refer to a single element of the collection. Unlike "foreach", we do not have to write a type.

Following this is another new keyword: "where".
where o.CustomerID == 84
This introduces a filter, allowing us to pick only some of the objects from the Orders collection. The "from" made the identifier "o" refer to a single item from the collection, and we write the condition in terms of this. If you type this query into the IDE yourself, you will notice that it has worked out that "o" is an Order and intellisense works as expected.

The final new keyword is "select".
select o.Cost
This comes at the end of the query and is a little like a "return" statement: it states what we want to appear in the collection holding the results of the query. As well as primitive types (such as int), you can instantiate any object you like here. In this case, we will end up with Found being a List<int>, though.

You may be thinking at this point, "hey, this looks like SQL but kind of backwards and twisted about a bit". That is a pretty good summary. I suspect many who have written a lot of SQL will find the "select comes last" a little grating at first; the other important thing to remember is that all of the conditions are to be expressed in C# syntax, not SQL syntax. That means "==" for equality testing, rather than "=" in SQL. Thankfully, in most cases that mistake will lead to a compile time error anyway.

A Few More Simple Queries
We may wish our query to return not only the Cost, but also the OrderID for each result that it finds. To do this we take advantage of anonymous types.
var Found = from o in Orders
where o.CustomerID == 84
select new { OrderID = o.OrderID, Cost = o.Cost };
Here we have defined an anonymous type that holds an OrderID and a Cost. This is where we start to see the power and flexibility that they offer; without them we would need to write custom classes for every possible set of results we wanted. Remembering the projection syntax, we can shorten this to:
var Found = from o in Orders
where o.CustomerID == 84
select new { o.OrderID, o.Cost };
And obtain the same result. Note that you can perform whatever computation you wish inside the anonymous type initializer. For example, we may wish to return the Cost of the order with an additional sales tax of 10% added on to it.
var Found = from o in Orders
where o.CustomerID == 84
select new {
o.OrderID,
o.Cost,
CostWithTax = o.Cost * 1.1
};
Conditions can be more complex too, and are built up in the usual C# way, just as you would do in an "if" statement. Here we apply an extra condition that we only want to see orders valued over a hundred pounds.
var Found = from o in Orders
where o.CustomerID == 84 && o.Cost > 100
select new {
o.OrderID,
o.Cost,
CostWithTax = o.Cost * 1.1
};


Ordering
It is possible to sort the results based upon a field or the result of a computation involving one or more fields. This is achieved by using the new "orderby" keyword.
var Found = from o in Orders
where o.CustomerID == 84
orderby o.Cost ascending
select new { o.OrderID, o.Cost };
After the "orderby" keyword, we write the expression that the objects will be sorted on. In this case, it is a single field. Notice this is different from SQL, where there are two words: "ORDER BY". I have added the keyword "ascending" at the end, though this is actually the default. The result is that we now get the orders in order of increasing cost, cheapest to most expensive. To get most expensive first, we would have used the "descending" keyword.

While I said earlier that the ordering condition is based on fields in the objects involved in the query, it actually doesn't have to be. Here's a way to get the results in a random order.
Random R = new Random();
var Found = from o in Orders
where o.CustomerID == 84
orderby R.Next()
select new { OrderID = o.OrderID, Cost = o.Cost };


Joins
So far we have just had one type of objects to run our query over. However, real life is usually more complex than this. For this example, let's introduce another class named Customer.
class Customer
{
private int _CustomerID;
private string _Name;
private string _Email;
public int CustomerID
{
get { return _CustomerID; }
set { _CustomerID = value; }
}
public string Name
{
get { return _Name; }
set { _Name = value; }
}
public string Email
{
get { return _Email; }
set { _Email = value; }
}
}
In the Main method, we will also instantiate a handful of Customer objects and place them in a list.
var Customers = new List<Customer> {
new Customer {
CustomerID = 7,
Name = "Emma",
Email = "emz0r@worreva.com"
},
new Customer {
CustomerID = 84,
Name = "Pedro",
Email = "pedro@cerveza.es"
},
new Customer {
CustomerID = 102,
Name = "Vladimir",
Email = "vladimir@pivo.ru"
}
};
We would like to produce a list featuring all orders, stating the ID and cost of the order along with the name of the customer. To do this we need to involve both the List of orders and the List of customers in our query. This is achieved using the "join" keyword. Let's replace our query and output code with the following.
// Query.
var Found = from o in Orders
join c in Customers on o.CustomerID equals c.CustomerID
select new { c.Name, o.OrderID, o.Cost };
// Display results.
foreach (var Result in Found)
Console.WriteLine(Result.Name + " spent " +
Result.Cost.ToString() + " in order " +
Result.OrderID.ToString());
The output of running this program is:
Pedro spent 159.12 in order 1
Emma spent 18.5 in order 2
Pedro spent 2.89 in order 3
We use the "join" keyword to indicate that we want to refer to another collection in our query. We then once again use the "in" keyword to declare an identifier that will refer to a single item in the collection; in this case it has been named "c". Finally, we need to specify how the two collections are related. This is achieved using the "on ... equals ..." syntax, where we name a field from each of the collections. In this case, we have stated that the CustomerID of an Order maps to the CustomerID of a Customer.

When the query is evaluated, an object in the Customers collection is located to match each object in the Orders collection. Note that if there were many customers with the same ID, there may be more than one matching Customer object per Order object. In this case, we get extra results. For example, change Vladimir to also have an OrderID of 84. The output of the program would then be:
Pedro spent 159.12 in order 1
Vladimir spent 159.12 in order 1
Emma spent 18.5 in order 2
Pedro spent 2.89 in order 3
Vladimir spent 2.89 in order 3
Notice that Vladimir never featured in the results before, since he had not ordered anything.

Getting All Permutations With Multiple "from"s
It is possible to write a query that gets every combination of the objects from two collections. This is achieved by using the "from" keyword multiple times.
var Found = from o in Orders
from c in Customers
select new { c.Name, o.OrderID, o.Cost };
Earlier I suggested that you could think of "from" as being a little bit like a "foreach". You can also think of multiple uses of "from" a bit like nested "foreach" loops; we are going to get every possible combination of the objects from the two collections. Therefore, the output will be:
Emma spent 159.12 in order 1
Pedro spent 159.12 in order 1
Vladimir spent 159.12 in order 1
Emma spent 18.5 in order 2
Pedro spent 18.5 in order 2
Vladimir spent 18.5 in order 2
Emma spent 2.89 in order 3
Pedro spent 2.89 in order 3
Vladimir spent 2.89 in order 3
Which is not especially useful. You may have spotted that you could have used "where" in conjunction with the two "from"s to get the same result as the join:
var Found = from o in Orders
from c in Customers
where o.CustomerID == c.CustomerID
select new { c.Name, o.OrderID, o.Cost };
However, don't do this, since it computes all of the possible combinations before the "where" clause, which goes on to throw most of them away. This is a waste of memory and computation. A join, on the other hand, never produces them in the first place.

Grouping
Another operations that you may wish to perform is categorizing objects that have the same value in a given field. For example, we might want to categorize orders by CustomerID. The result we expect back is a list of groups, where each group has a key (in this case, the CustomerID) and a list of matching objects. Here's the code to do the query and output the results.
// Group orders by customer.
var OrdersByCustomer = from o in Orders
group o by o.CustomerID;
// Iterate over the groups.
foreach (var Cust in OrdersByCustomer)
{
// About the customer...
Console.WriteLine("Customer with ID " + Cust.Key.ToString() +
" ordered " + Cust.Count().ToString() + " items.");
// And what they ordered.
foreach (var Item in Cust)
Console.WriteLine(" ID: " + Item.OrderID.ToString() +
" Cost: " + Item.Cost.ToString());
}
The output that it produces is as follows:
Customer with ID 84 ordered 2 items.
ID: 1 Cost: 159.12
ID: 3 Cost: 2.89
Customer with ID 7 ordered 1 items.
ID: 2 Cost: 18.5
This query looks somewhat different to the others that we have seen so far in that it does not end with a "select". The first line is the same as we're used to. The second introduces the new "group" and "by" keywords. After the "by" we name the field that we are going to group the objects by. Before the "by" we put what we would like to see in the resulting per-group collections. In this case, we write "o" so as to get the entire object. If we had only been interested in the Cost field, however, we could have written:
// Group orders by customer.
var OrdersByCustomer = from o in Orders
group o.Cost by o.CustomerID;
// Iterate over the groups.
foreach (var Cust in OrdersByCustomer)
{
// About the customer...
Console.WriteLine("Customer with ID " + Cust.Key.ToString() +
" ordered " + Cust.Count().ToString() + " items.");
// And the costs of what they ordered.
foreach (var Cost in Cust)
Console.WriteLine(" Cost: " + Cost.ToString());
}
Which produces the output:
Customer with ID 84 ordered 2 items.
Cost: 159.12
Cost: 2.89
Customer with ID 7 ordered 1 items.
Cost: 18.5
You are not restricted to just a single field or the object itself; you could, for example, instantiate an anonymous type there instead.

Query Continuations
At this point you might be wondering if you can follow a "group ... by ..." with a "select". The answer is yes, but not directly. Both "group ... by ..." and "select" are special in so far as they produce a result. You must terminate a Linq query with one or the other. If you try to do something like:
var CheapOrders = from o in Orders
where o.Cost < 10;
Then it will lead to a compilation error. Since both "select" and "group ... by ..." terminate a query, you need a way of taking the results and using them as the input to another query. This is called a query continuation, and the keyword for this is "into".

In the following example we take the result of grouping orders by customer and then use a select to return an anonymous type containing the CustomerID and the number of orders that the customer has placed.
var OrderCounts = from o in Orders
group o by o.CustomerID into g
select new {
CustomerID = g.Key,
TotalOrders = g.Count()
};
Notice the identifier "g", which we introduce after the keyword "into". This identifier represents an item in the collection containing the results of the previous query. We use in the select statement. Remember that each element of the collection we are querying in this second query is actually a collection itself, since this is what "group ... by ..." produces. Therefore, we can call Count() on it to get the number of elements, which is the number of orders per customer. We grouped by the CustomerID field, so that is our Key.

Query continuations can be used to chain together as many selection and grouping queries as you need in whatever order you need.

Under The Hood
Now we have looked at the practicalities of using Linq, I am going to spend a little time taking a look at how it works. Don't worry if you don't understand everything in this section, it's here for those who like to dig a little deeper.

Throughout the series I have talked about how all of the language features introduced in C# 3.0 somehow help to make Linq possible. While anonymous types have shown up pretty explicitly and you can see from the lack of type annotations we have been writing that there is some type inference going on, where are the extension methods and lambda expressions?

There's a principle in language design and implementation called "syntactic sugar". We use this to describe cases where certain syntax isn't directly compiled, but is first transformed into some other more primitive syntax and then passed to the compiler. This is exactly what happens with Linq: your queries are transformed into a sequence of method calls and lambda expressions.

The C# 3.0 specification goes into great detail about these transformations. In practice, you probably don't need to know about this, but let's look at one example to help us understand what is going on. Our simple query from earlier:
var Found = from o in Orders
where o.CustomerID == 84
select o.Cost;
After transformation by the compiler, becomes:
var Found = Orders.Where(o => o.CustomerID == 84)
.Select(o => o.Cost);
And this is what actually gets compiled. Here the use of lambda expressions becomes clear. The lambda passed to the Where method is called on each element of Orders to determine whether it should be in the result or not. This produces another intermediate collection, which we then call the Select method on. This calls the lambda it is passed on each object and builds up a final collection of the results, which is then assigned to Found. Beautiful, huh?

Finally, a note on extension methods. Both Where and Select, along with a range of other methods, have been implemented as extension methods. The type they use for "this" is IEnumerable, meaning that any collection that implements that interface can be used with Linq. Without extension methods, it would not have been possible to achieve this level of code re-use.

DLinq and XLinq
In this article I have demonstrated Linq working with objects instantiated from classes that we implemented ourselves and stored in built-in collection classes that implement IEnumerable. However, the query syntax compiles down to calls on extension methods. This means that it is possible to write alternative implementations of Linq that follow the same syntax but perform different operations.

Two examples of this, which will ship with C# 3.0, are DLinq and XLinq. DLinq enables the same language integrated query syntax to do queries on databases by translating the Linq into SQL. XLinq enables queries on XML documents.

Conclusion
Linq brings declarative programming to the C# language and will refine and unify the way that we work with objects, databases, XML and whatever anyone else writes the appropriate extension methods for. It builds upon the language features that we have already seen in the previous parts of the series, but hiding some of them away under syntactic sugar. While the query language has a range of differences to SQL, there are enough similarities to make knowledge of SQL useful to those who know it. However, its utility is far beyond providing yet another way to work with databases.

Closing Thoughts On C# 3.0
This brings us to the end of this four part series on C# 3.0. Here is a quick recap on all that we have seen.
Type inference removes much of the tedium of writing out type annotations again and again.
Lambda expressions make higher order programming syntactically light.
Extension methods provide another path to better code re-use when correctly applied.
Object and collection initializers along with anonymous types make building up large data structures much less effort.
Linq gives us declarative programming abilities over objects, databases and XML documents.
When I saw C# 1.0 I highly doubted that C# was going to be a language I would ever be excited about. I have been pleasantly surprised, and writing this series has been a lot of fun. I hope that it has been informative and enjoyable to read, and that it will help you to make powerful use of the new language features. I greatly look forward to being able to use them in my own day-to-day development and seeing how other people use them.

Of course, knowing about something and doing it yourself are two entirely different things; if you haven't already done so, grab yourself the Visual Studio 2008 trial or the free Express Edition. Only then will you become comfortable with the new features and be able to use them effectively in your own development. Happy hacking, and have fun!
# re: Een eerste blik op LINQ
7/8/2009 10:58 AM by xxxxxx
<html>

<head></head>

<body>
<b>test</b>
</body>

</html>
Post Comment

Title
Name
Url
Comment

Remember Me?

ATTENTION: the code you need to copy is CaSe SeNsItIvE and is required to prevent spam.
Enter the code you see:




Copyright © Dennis Vroegop

# re: Een eerste blik op LINQ

7/8/2009 11:08 AM by Barack Obama and Joe Biden
Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden Barack Obama and Joe Biden SUCKS

# re: Een eerste blik op LINQ

7/8/2009 11:08 AM by Barack Obama and Joe Biden
FOR the nature of hilary

# re: Een eerste blik op LINQ

7/8/2009 11:12 AM by poem
in the night i see those star shine on the street

shine like they have never seen each other

keep on seeing en keep on seeing

try to say something to each other

never look away from each other

when i took a closer look

saw they were kissing but nothing more.....

# re: Een eerste blik op LINQ

9/11/2009 4:01 PM by cet
thanks

# P90X Workout DVD

9/4/2010 8:30 AM by hou
http://www.aupair-star.com the quality of our p90x workout DVD is very good.

http://www.rolex-mens.com please believe me selecting our Watch is the best choice.

http://www.itunes-gift-card.net our redeem itunes gift card are economical and practical.

# re: Een eerste blik op LINQ

9/21/2010 9:55 AM by p90x Workout DVD
http://www.albatouristik.com p90x
http://www.rosetta-stone-shop.net Rosetta Stone.com
http://www.itunes-gift-cards.org itunes gift card app store

# p90x price

9/24/2010 4:59 AM by annahappy
With the development of tecnology and economy, more and more people tend to pay more attention to their body. They want to have better shape and healthier body. Here, I will introduce a good program to you—<a href="http://www.auto-ok-erlangen.com">p90x">http://www.auto-ok-erlangen.com">p90x">http://www.auto-ok-erlangen.com">p90x">http://www.auto-ok-erlangen.com">p90x price</a>. from America.<a href="http://www.auto-ok-erlangen.com">p90x">http://www.auto-ok-erlangen.com">p90x">http://www.auto-ok-erlangen.com">p90x">http://www.auto-ok-erlangen.com">p90x price</a> is classic training DVD which covers all manner of fitness methods. It include 13 <a href="http://www.auto-ok-erlangen.com">p90x">http://www.auto-ok-erlangen.com">p90x">http://www.auto-ok-erlangen.com">p90x">http://www.auto-ok-erlangen.com">p90x price</a>and beachbody complete training for 90 days. Please image that you will hve your dreamed body and shape in 90 days.There are also many other fasion sports included in p90x. they are waiting for you to find.
How can you learning languages without <a href="http://www.rosetta-stone-shop.org">Rosetta">http://www.rosetta-stone-shop.org">Rosetta Stone Spanish</a>. Here, I am not point the real stone in British Museum. The real rosetta stone is a stone that has Greek, Egyptian script and the words popular during that time.
If you want to learn another language to improve yourself, you can choose this useful software <a href="http://www.rosetta-stone-shop.org">Rosetta">http://www.rosetta-stone-shop.org">Rosetta Stone Spanish</a> to enhance your level of languages.
<a href="http://www.itunes-gift-card.org">itunes gift card,itunes code</a>
<a href="http://www.watches-mens.com">mens watches</a>
<a href="http://www.watches-mens.com/breitling-navitimer">breitling navitimer</a>
<a href="http://www.watches-mens.com/rolex-datejust">rolex datejust</a>
<a href="http://www.watches-mens.com/breitling-crosswind">breitling Navitimer</a>
<a href="http://www.watches-mens.com/panerai">panerai watches</a>
<a href="http://www.watches-mens.com/bvlgari">bvlgari watches</a>
<a href="http://www.watches-mens.com/breitling">breitling</a>
<a href="http://www.highwaytowatches.com/Hublot">Hublot</a>
<a href="http://www.highwaytowatches.com/burberry">burberry watches</a>
<a href="http://www.highwaytowatches.com/">siwss watches</a>

# rolex submariner

10/15/2010 7:53 AM by rolex submariner
http://www.watches-mens.com
http://www.watches-mens.com/rolex-submariner
http://www.watches-mens.com/breitling-navitimer
http://www.watches-mens.com/hublot
http://www.watches-mens.com/panerai
http://www.watches-mens.com/rolex-daytona
http://www.watches-mens.com/breitling
http://www.watches-mens.com/iwc
http://www.watches-mens.com/tag-heuer
http://www.watches-mens.com/chopard
http://www.watches-mens.com/omega-seamaster

# ferrari watches

10/19/2010 5:42 AM by ferrari watches

http://www.highwaywatches.com
http://www.highwaywatches.com/panerai
http://www.highwaywatches.com/Hublot
http://www.highwaywatches.com/breitling-Navitimer
http://www.highwaywatches.com/rolex-DateJust
http://www.highwaywatches.com/rolex-Submariner
http://www.highwaywatches.com/rolex-Daytona
http://www.highwaywatches.com/Chopard
http://www.highwaywatches.com/burberry
http://www.highwaywatches.com/breguet
http://www.highwaywatches.com/patek-philippe
http://www.highwaywatches.com/Audemars-Piguet
http://www.highwaywatches.com/tag-heuer
http://www.highwaywatches.com/U-Boat
http://www.highwaywatches.com/Franck-Muller
http://www.highwaywatches.com/B-R-M
http://www.highwaywatches.com/A-Lange-Sohne
http://www.highwaywatches.com/Ferrari

# replica watches

10/19/2010 5:42 AM by replica watches
http://www.worldwide-watches.com
http://www.worldwide-watches.com/rolex-watches
http://www.worldwide-watches.com/rolex-air-king-watches
http://www.worldwide-watches.com/breguet-watches
http://www.worldwide-watches.com/blancpain-watches
http://www.worldwide-watches.com/bell-ross-watches
http://www.worldwide-watches.com/baume-mercier-watches
http://www.worldwide-watches.com/bvlgari-watches
http://www.worldwide-watches.com/chopard-watches-c-24
http://www.worldwide-watches.com/rolex-datejust-watches
http://www.worldwide-watches.com/dewitt-watches
http://www.worldwide-watches.com/montblanc-watches
http://www.worldwide-watches.com/oris-watches
http://www.worldwide-watches.com/panerai-watches
http://www.worldwide-watches.com/patek-philippe-watches
http://www.worldwide-watches.com/piaget-watches
http://www.worldwide-watches.com/rado-watches
http://www.worldwide-watches.com/rolex-submariner-watches
http://www.worldwide-watches.com/tudor-watches
http://www.worldwide-watches.com/u-boat-watches
http://www.worldwide-watches.com/ebel-watches
http://www.worldwide-watches.com/ferrari-watches
http://www.worldwide-watches.com/franck-muller-watches
http://www.worldwide-watches.com/glashutte-watches
http://www.worldwide-watches.com/gucci-watches-c-113
http://www.worldwide-watches.com/hermes-watches
http://www.worldwide-watches.com/hublot-watches
http://www.worldwide-watches.com/iwc-watches
http://www.worldwide-watches.com/louis-vuitton-watches
http://www.worldwide-watches.com/maurice-lacroix-watches

# rolex watches

10/19/2010 5:43 AM by rolex watches
http://www.rolex-mens.com">http://www.rolex-mens.com">http://www.rolex-mens.com">http://www.rolex-mens.com
http://www.rolex-mens.com">http://www.rolex-mens.com">http://www.rolex-mens.com">http://www.rolex-mens.com/Deepsea
http://www.rolex-mens.com">http://www.rolex-mens.com">http://www.rolex-mens.com">http://www.rolex-mens.com/Perpetual
http://www.rolex-mens.com">http://www.rolex-mens.com">http://www.rolex-mens.com">http://www.rolex-mens.com/Daytona
http://www.rolex-mens.com">http://www.rolex-mens.com">http://www.rolex-mens.com">http://www.rolex-mens.com/Datejust
http://www.rolex-mens.com">http://www.rolex-mens.com">http://www.rolex-mens.com">http://www.rolex-mens.com/Air-king
http://www.rolex-mens.com">http://www.rolex-mens.com">http://www.rolex-mens.com">http://www.rolex-mens.com/Submariner
http://www.rolex-mens.com">http://www.rolex-mens.com">http://www.rolex-mens.com">http://www.rolex-mens.com
http://www.rolex-mens.com">http://www.rolex-mens.com">http://www.rolex-mens.com">http://www.rolex-mens.com

# uggs boots shoes

10/19/2010 5:44 AM by uggs boots shoes
http://www-ugg-outlet.com">http://www-ugg-outlet.com">http://www-ugg-outlet.com">http://www-ugg-outlet.com
http://www-ugg-outlet.com">http://www-ugg-outlet.com">http://www-ugg-outlet.com">http://www-ugg-outlet.com
http://www-ugg-outlet.com">http://www-ugg-outlet.com">http://www-ugg-outlet.com">http://www-ugg-outlet.com
http://www.ugg-website.net">http://www.ugg-website.net">http://www.ugg-website.net">http://www.ugg-website.net
http://www.ugg-website.net">http://www.ugg-website.net">http://www.ugg-website.net">http://www.ugg-website.net/
http://www.ugg-website.net">http://www.ugg-website.net">http://www.ugg-website.net">http://www.ugg-website.net
http://www.ugg-website.net">http://www.ugg-website.net">http://www.ugg-website.net">http://www.ugg-website.net
http://www-ugg-outlet.com">http://www-ugg-outlet.com">http://www-ugg-outlet.com">http://www-ugg-outlet.com/ugg-nightfall-boots-c-7
http://www-ugg-outlet.com">http://www-ugg-outlet.com">http://www-ugg-outlet.com">http://www-ugg-outlet.com/ugg-classic-tall-boots-c-11
http://www-ugg-outlet.com">http://www-ugg-outlet.com">http://www-ugg-outlet.com">http://www-ugg-outlet.com/ugg-bailey-button-triplet-boots-c-44
http://www.ugg-website.net">http://www.ugg-website.net">http://www.ugg-website.net">http://www.ugg-website.net/ugg-suede-tall-boots-c-46
http://www.ugg-website.net">http://www.ugg-website.net">http://www.ugg-website.net">http://www.ugg-website.net/ugg-ultra-short-boots-c-6

# Norton 360

10/19/2010 9:36 AM by oem software
dsfdsfdsfads

# xNsdfnLHNF525363

11/7/2010 2:36 AM by girl spanking story
girls school spanking - http://distortion2static.ning.com/forum/topics/girls-school-spanking
girls spanking each other - http://www.soulcommune.com/profiles/blogs/girls-spanking-each-other
give good hard spanking - http://www.certifiedsouljas.com/forum/topics/give-good-hard-spanking
girls getting spankings - http://www.snowboarder-community.com/forum/topics/girls-getting-spankings
girls boarding school spanking pics - http://carolinescomedy.ning.com/forum/topics/girls-boarding-school-spanking
gjc spanking drawings - http://comunidad.todotnv.com/forum/topics/gjc-spanking-drawings
girls school spanking stories - http://www.kiwipulse.co.nz/profiles/blogs/girls-school-spanking-stories
girls spankings - http://atlclubs.ning.com/forum/topics/girls-spankings
girls stripped for spanking - http://community.bigkenny.tv/profiles/blogs/girls-stripped-for-spanking
give her a good spanking - http://www.dreambighustlehard.com/forum/topics/give-her-a-good-spanking
girls boarding school spanking site - http://coloradodaily.ning.com/forum/topics/girls-boarding-school-spanking
girl spanking videos - http://pisutta.ning.com/forum/topics/girl-spanking-videos
give you the spankings - http://community.shoe4africa.org/profiles/blogs/give-you-the-spankings
girls boarding school spanking trailers - http://philly1.com/forum/topics/girls-boarding-school-spanking
given spankings - http://www.startupspace.com/profiles/blogs/given-spankings
girls boarding school spankings - http://www.thepatriotcaucus.net/forum/topics/girls-boarding-school
goldie hawn spanking - http://suzyrock.ning.com/forum/topics/goldie-hawn-spanking
girls boarding school spanking pictures - http://www.studentuk.com/forum/topics/girls-boarding-school-spanking
girls boarding school spanking - http://my.theberrics.com/forum/topics/girls-boarding-school-spanking
girls school spankings - http://www.mypetmove.com/forum/topics/girls-school-spankings
girls boarding school spanking videos - http://www.tripflix.com/forum/topics/girls-boarding-school-spanking
give her a spanking - http://therealtaylormomsen.com/forum/topics/give-her-a-spanking
give good sound spanking - http://www.inkedinc.net/forum/topics/give-good-sound-spanking
girls boarding spanking - http://gospeltoday.ning.com/profiles/blogs/girls-boarding-spanking
giving spankings - http://www.youthcabinet.org/forum/topics/giving-spankings
girls bottoms in tight jeans getting spankings - http://jaredsrenegadefashion.ning.com/forum/topics/girls-bottoms-in-tight-jeans
girls boarding school spanking video - http://www.martinatopleybird.com/forum/topics/girls-boarding-school-spanking
girls boarding school spanking gallery - http://woodtube.ning.com/forum/topics/girls-boarding-school-spanking
gloria brame spanking - http://www.myamericanism.com/profiles/blogs/gloria-brame-spanking

# xNsdfnLHNF731169

11/8/2010 3:02 AM by mature female enjoyable spanking
spanking teen video - http://jaredsrenegadefashion.ning.com/forum/topics/spanking-teen-video
mature female devastating spanking - http://www.inkedinc.net/forum/topics/mature-female-devastating
mature female delicious spanking - http://community.shoe4africa.org/profiles/blogs/mature-female-delicious
spanking technique - http://www.studentuk.com/forum/topics/spanking-technique
mature female bloody spanking - http://www.jijisweet.com/forum/topics/mature-female-bloody-spanking
spanking tales - http://carolinescomedy.ning.com/forum/topics/spanking-tales
mature female crazy spanking - http://www.myamericanism.com/profiles/blogs/mature-female-crazy-spanking
spanking teen brandy - http://www.tripflix.com/forum/topics/spanking-teen-brandy
mature female disgusting spanking - http://community.bigkenny.tv/profiles/blogs/mature-female-disgusting
mature female dark spanking - http://www.startupspace.com/profiles/blogs/mature-female-dark-spanking
spanking teen jessica - http://gospeltoday.ning.com/profiles/blogs/spanking-teen-jessica
spanking submissives - http://www.nashville.net/profiles/blogs/spanking-submissives
mature female drunk spanking - http://www.dreambighustlehard.com/forum/topics/mature-female-drunk-spanking
spanking submissive - http://3dmuziqnation.ning.com/forum/topics/spanking-submissive
mature female cute spanking - http://comunidad.todotnv.com/forum/topics/mature-female-cute-spanking
mature female depraved spanking - http://therealtaylormomsen.com/forum/topics/mature-female-depraved
spanking teen videos - http://www.snowboarder-community.com/forum/topics/spanking-teen-videos
mature female black spanking - http://suzyrock.ning.com/forum/topics/mature-female-black-spanking
mature female dirty spanking - http://www.certifiedsouljas.com/forum/topics/mature-female-dirty-spanking
spanking teen brandi - http://philly1.com/forum/topics/spanking-teen-brandi
mature female dangerous spanking - http://www.youthcabinet.org/forum/topics/mature-female-dangerous
spanking submissive wife - http://www.blogyourtravel.com/forum/topics/spanking-submissive-wife
spanking switching and domestic discipline - http://my.theberrics.com/forum/topics/spanking-switching-and
mature female bisexual spanking - http://www.718unlimited.com/forum/topics/mature-female-bisexual
spanking teen gallery - http://www.thepatriotcaucus.net/forum/topics/spanking-teen-gallery
spanking teen brandie - http://www.martinatopleybird.com/forum/topics/spanking-teen-brandie
mature female double spanking - http://atlclubs.ning.com/forum/topics/mature-female-double-spanking
spanking sues woman - http://www.atlanticstreet.com/profiles/blogs/spanking-sues-woman
spanking techniques - http://coloradodaily.ning.com/forum/topics/spanking-techniques

# xNsdfnLHNF416799

11/8/2010 9:21 AM by mature dirty spanking gallery
women spanking men top 100 - http://suzyrock.ning.com/forum/topics/women-spanking-men-top-100
mature dark spanking gallery - http://www.inkedinc.net/forum/topics/mature-dark-spanking-gallery
mature dire spanking gallery - http://www.soulcommune.com/profiles/blogs/mature-dire-spanking-gallery
women spanking men videos - http://3dmuziqnation.ning.com/forum/topics/women-spanking-men-videos
mature black spanking gallery - http://www.youthcabinet.org/forum/topics/mature-black-spanking-gallery
women spanking men video - http://www.718unlimited.com/forum/topics/women-spanking-men-video
women spanking men stories - http://www.myamericanism.com/profiles/blogs/women-spanking-men-stories
mature dangerous spanking gallery - http://www.dreambighustlehard.com/forum/topics/mature-dangerous-spanking
mature bisexual spanking gallery - http://comunidad.todotnv.com/forum/topics/mature-bisexual-spanking
wooden paddles spanking - http://coloradodaily.ning.com/forum/topics/wooden-paddles-spanking
women spanking women video clips - http://www.atlanticstreet.com/profiles/blogs/women-spanking-women-video
women spanking men pictures - http://comunidad.todotnv.com/forum/topics/women-spanking-men-pictures
wooden spanking paddles - http://philly1.com/forum/topics/wooden-spanking-paddles
wood paddle spanking - http://carolinescomedy.ning.com/forum/topics/wood-paddle-spanking
mature amazing spanking gallery - http://suzyrock.ning.com/forum/topics/mature-amazing-spanking
mature naked spanking gallery - http://www.jijisweet.com/forum/topics/mature-naked-spanking-gallery
women spanking women pics - http://www.nashville.net/profiles/blogs/women-spanking-women-pics
women spanking men thick leather belt bare bottom - http://www.jijisweet.com/forum/topics/women-spanking-men-thick
mature beautiful spanking gallery - http://www.myamericanism.com/profiles/blogs/mature-beautiful-spanking
women spanking men video clips - http://www.mcafeonline.com/forum/topics/women-spanking-men-video-clips
mature depraved spanking gallery - http://www.certifiedsouljas.com/forum/topics/mature-depraved-spanking
mature bloody spanking gallery - http://www.startupspace.com/profiles/blogs/mature-bloody-spanking-gallery
wooden spoon spanking - http://www.martinatopleybird.com/forum/topics/wooden-spoon-spanking
mature crazy spanking gallery - http://community.shoe4africa.org/profiles/blogs/mature-crazy-spanking-gallery
mature drunk spanking gallery - http://community.bigkenny.tv/profiles/blogs/mature-drunk-spanking-gallery
mature cute spanking gallery - http://therealtaylormomsen.com/forum/topics/mature-cute-spanking-gallery
mature devastating spanking gallery - http://atlclubs.ning.com/forum/topics/mature-devastating-spanking
women spanking women - http://www.blogyourtravel.com/forum/topics/women-spanking-women
wood spanking paddles - http://www.studentuk.com/forum/topics/wood-spanking-paddles

# xNsdfnLHNF13984

11/9/2010 11:25 AM by mf inexorable spanking
adult adult man pic extreme bdsm spanking woman - http://distortion2static.ning.com/forum/topics/adult-adult-man-pic-extreme
mf remorseless spanking - http://www.kiwipulse.co.nz/profiles/blogs/mf-remorseless-spanking
mf savage spanking - http://www.inkedinc.net/forum/topics/mf-savage-spanking
adult adult man pic advanced bdsm spanking woman - http://www.thepatriotcaucus.net/forum/topics/adult-adult-man-pic-advanced
mf powerful spanking - http://therealtaylormomsen.com/forum/topics/mf-powerful-spanking
mf ruthless spanking - http://www.snowboarder-community.com/forum/topics/mf-ruthless-spanking
adult adult man pic naked bdsm spanking woman - http://www.martinatopleybird.com/forum/topics/adult-adult-man-pic-naked-bdsm
adult adult man pic abject bdsm spanking woman - http://jaredsrenegadefashion.ning.com/forum/topics/adult-adult-man-pic-abject
mf fierce spanking - http://www.dreambighustlehard.com/forum/topics/mf-fierce-spanking
mf brutal spanking - http://www.certifiedsouljas.com/forum/topics/mf-brutal-spanking
adult adult man pic beautiful bdsm spanking woman - http://philly1.com/forum/topics/adult-adult-man-pic-beautiful
adult adult man pic black bdsm spanking woman - http://www.studentuk.com/forum/topics/adult-adult-man-pic-black-bdsm
mf pitiless spanking - http://jaredsrenegadefashion.ning.com/forum/topics/mf-pitiless-spanking
mf implacable spanking - http://www.soulcommune.com/profiles/blogs/mf-implacable-spanking
mf mature spanking - http://community.shoe4africa.org/profiles/blogs/mf-mature-spanking
adult adult man pic delicious bdsm spanking woman - http://www.nashville.net/profiles/blogs/adult-adult-man-pic-delicious
adult adult man pic bloody bdsm spanking woman - http://carolinescomedy.ning.com/forum/topics/adult-adult-man-pic-bloody
adult adult man pic bisexual bdsm spanking woman - http://coloradodaily.ning.com/forum/topics/adult-adult-man-pic-bisexual
mf merciless spanking - http://distortion2static.ning.com/forum/topics/mf-merciless-spanking
mf uncompromising spanking - http://www.mypetmove.com/forum/topics/mf-uncompromising-spanking
adult adult man pic drunk bdsm spanking woman - http://3dmuziqnation.ning.com/forum/topics/adult-adult-man-pic-drunk-bdsm
mf atrocious spanking - http://community.bigkenny.tv/profiles/blogs/mf-atrocious-spanking
mf cruel spanking - http://atlclubs.ning.com/forum/topics/mf-cruel-spanking
mf amateur spanking - http://www.startupspace.com/profiles/blogs/mf-amateur-spanking
adult adult man pic amazing bdsm spanking woman - http://www.tripflix.com/forum/topics/adult-adult-man-pic-amazing
adult adult man pic absolute bdsm spanking woman - http://gospeltoday.ning.com/profiles/blogs/adult-adult-man-pic-absolute
adult adult man pic hot bdsm spanking woman - http://www.snowboarder-community.com/forum/topics/adult-adult-man-pic-hot-bdsm
adult adult man pic depraved bdsm spanking woman - http://www.blogyourtravel.com/forum/topics/adult-adult-man-pic-depraved
adult adult man pic devastating bdsm spanking woman - http://www.mcafeonline.com/forum/topics/adult-adult-man-pic

# xNsdfnLHNF998333

11/9/2010 8:28 PM by mike from london bisexual spanking
adult adult dire spanking story - http://www.thepatriotcaucus.net/forum/topics/adult-adult-dire-spanking
adult adult devastating spanking story - http://gospeltoday.ning.com/profiles/blogs/adult-adult-devastating
mike from london extreme spanking - http://atlclubs.ning.com/forum/topics/mike-from-london-extreme
mike from london hot spanking - http://www.soulcommune.com/profiles/blogs/mike-from-london-hot-spanking
mike from london beautiful spanking - http://gospeltoday.ning.com/profiles/blogs/mike-from-london-beautiful
adult adult kinky spanking story - http://www.blogyourtravel.com/forum/topics/adult-adult-kinky-spanking
adult adult amateur spanking story - http://3dmuziqnation.ning.com/forum/topics/adult-adult-amateur-spanking
adult adult double spanking story - http://philly1.com/forum/topics/adult-adult-double-spanking
mike from london sadistic femdom spanking stories - http://therealtaylormomsen.com/forum/topics/mike-from-london-sadistic
adult adult elegant spanking story - http://www.studentuk.com/forum/topics/adult-adult-elegant-spanking
mike from london rough femdom spanking stories - http://www.dreambighustlehard.com/forum/topics/mike-from-london-rough-femdom
mike from london ebony spanking - http://www.certifiedsouljas.com/forum/topics/mike-from-london-ebony
mike from london advanced spanking - http://distortion2static.ning.com/forum/topics/mike-from-london-advanced
adult adult insane spanking story - http://www.nashville.net/profiles/blogs/adult-adult-insane-spanking
adult adult enjoyable spanking story - http://coloradodaily.ning.com/forum/topics/adult-adult-enjoyable-spanking
adult adult drunk spanking story - http://jaredsrenegadefashion.ning.com/forum/topics/adult-adult-drunk-spanking
mike from london painful spanking - http://community.bigkenny.tv/profiles/blogs/mike-from-london-painful
mike from london naked femdom spanking stories - http://www.inkedinc.net/forum/topics/mike-from-london-naked-femdom
adult adult dirty spanking story - http://www.tripflix.com/forum/topics/adult-adult-dirty-spanking
adult adult fierce spanking story - http://suzyrock.ning.com/forum/topics/adult-adult-fierce-spanking
mike from london abject spanking - http://www.mypetmove.com/forum/topics/mike-from-london-abject
adult adult disgusting spanking story - http://www.martinatopleybird.com/forum/topics/adult-adult-disgusting
mike from london amazing spanking - http://www.snowboarder-community.com/forum/topics/mike-from-london-amazing
adult adult mature spanking story - http://www.mcafeonline.com/forum/topics/adult-adult-mature-spanking
adult adult explicit spanking story - http://carolinescomedy.ning.com/forum/topics/adult-adult-explicit-spanking
mike from london relentless femdom spanking stories - http://community.shoe4africa.org/profiles/blogs/mike-from-london-relentless
mike from london absolute spanking - http://www.kiwipulse.co.nz/profiles/blogs/mike-from-london-absolute
adult adult powerful spanking story - http://www.718unlimited.com/forum/topics/adult-adult-powerful-spanking
mike from london naked spanking - http://jaredsrenegadefashion.ning.com/forum/topics/mike-from-london-naked

# xNsdfnLHNF38677

11/9/2010 8:40 PM by mike from london inexorable bdsm spanking stories
adult after bed enema get dire femdom spanking wetting - http://comunidad.todotnv.com/forum/topics/adult-after-bed-enema-get-dire
adult after bed enema get advanced femdom spanking wetting - http://coloradodaily.ning.com/forum/topics/adult-after-bed-enema-get-1
mike from london brutal bdsm spanking stories - http://www.mypetmove.com/forum/topics/mike-from-london-brutal-bdsm
adult after bed enema get drunk femdom spanking wetting - http://www.jijisweet.com/forum/topics/adult-after-bed-enema-get
mike from london outrageous bdsm spanking stories - http://www.soulcommune.com/profiles/blogs/mike-from-london-outrageous
mike from london powerful bdsm spanking stories - http://www.certifiedsouljas.com/forum/topics/mike-from-london-powerful-bdsm
mike from london amateur bdsm spanking stories - http://www.inkedinc.net/forum/topics/mike-from-london-amateur-bdsm
adult after bed enema get amazing femdom spanking wetting - http://www.studentuk.com/forum/topics/adult-after-bed-enema-get-1
adult after bed enema get delicious femdom spanking wetting - http://www.718unlimited.com/forum/topics/adult-after-bed-enema-get
adult after bed enema get dark femdom spanking wetting - http://www.mcafeonline.com/forum/topics/adult-after-bed-enema-get-dark
mike from london fierce bdsm spanking stories - http://community.bigkenny.tv/profiles/blogs/mike-from-london-fierce-bdsm
adult after bed enema get naked femdom spanking wetting - http://carolinescomedy.ning.com/forum/topics/adult-after-bed-enema-get-1
adult after bed enema get dangerous femdom spanking wetting - http://3dmuziqnation.ning.com/forum/topics/adult-after-bed-enema-get-1
mike from london uncompromising bdsm spanking stories - http://jaredsrenegadefashion.ning.com/forum/topics/mike-from-london
adult after bed enema get crazy femdom spanking wetting - http://www.nashville.net/profiles/blogs/adult-after-bed-enema-get-1
adult after bed enema get absolute femdom spanking wetting - http://philly1.com/forum/topics/adult-after-bed-enema-get-1
adult after bed enema get hot femdom spanking wetting - http://www.tripflix.com/forum/topics/adult-after-bed-enema-get-hot
mike from london merciless bdsm spanking stories - http://www.thepatriotcaucus.net/forum/topics/mike-from-london-merciless
adult after bed enema get depraved femdom spanking wetting - http://suzyrock.ning.com/forum/topics/adult-after-bed-enema-get
mike from london remorseless bdsm spanking stories - http://gospeltoday.ning.com/profiles/blogs/mike-from-london-remorseless
mike from london ruthless bdsm spanking stories - http://www.tripflix.com/forum/topics/mike-from-london-ruthless-bdsm
mike from london implacable bdsm spanking stories - http://www.snowboarder-community.com/forum/topics/mike-from-london-implacable
adult after bed enema get cute femdom spanking wetting - http://www.blogyourtravel.com/forum/topics/adult-after-bed-enema-get-cute
mike from london cruel bdsm spanking stories - http://distortion2static.ning.com/forum/topics/mike-from-london-cruel-bdsm
adult after bed enema get devastating femdom spanking wetting - http://www.myamericanism.com/profiles/blogs/adult-after-bed-enema-get
mike from london pitiless bdsm spanking stories - http://www.martinatopleybird.com/forum/topics/mike-from-london-pitiless-bdsm
adult after bed enema get abject femdom spanking wetting - http://www.martinatopleybird.com/forum/topics/adult-after-bed-enema-get-1
mike from london savage bdsm spanking stories - http://atlclubs.ning.com/forum/topics/mike-from-london-savage-bdsm
mike from london atrocious bdsm spanking stories - http://www.kiwipulse.co.nz/profiles/blogs/mike-from-london-atrocious

# xNsdfnLHNF279075

11/11/2010 6:27 AM by mmsa explicit bdsm spanking story
mmsa dire bdsm spanking story - http://www.myamericanism.com/profiles/blogs/mmsa-dire-bdsm-spanking-story
adult knee over remorseless bdsm spanking - http://suzyrock.ning.com/forum/topics/adult-knee-over-remorseless
adult knee over inexorable bdsm spanking - http://www.youthcabinet.org/forum/topics/adult-knee-over-inexorable
mmsa dark bdsm spanking story - http://3dmuziqnation.ning.com/forum/topics/mmsa-dark-bdsm-spanking-story
adult knee over kinky bdsm spanking - http://coloradodaily.ning.com/forum/topics/adult-knee-over-kinky-bdsm
adult knee over sadistic bdsm spanking - http://community.shoe4africa.org/profiles/blogs/adult-knee-over-sadistic-bdsm
adult knee over atrocious bdsm spanking - http://www.blogyourtravel.com/forum/topics/adult-knee-over-atrocious-bdsm
mmsa devastating bdsm spanking story - http://www.jijisweet.com/forum/topics/mmsa-devastating-bdsm-spanking
adult knee over ruthless bdsm spanking - http://www.myamericanism.com/profiles/blogs/adult-knee-over-ruthless-bdsm
mmsa depraved bdsm spanking story - http://www.718unlimited.com/forum/topics/mmsa-depraved-bdsm-spanking
adult knee over brutal bdsm spanking - http://www.nashville.net/profiles/blogs/adult-knee-over-brutal-bdsm
mmsa double bdsm spanking story - http://www.startupspace.com/profiles/blogs/mmsa-double-bdsm-spanking
mmsa drunk bdsm spanking story - http://suzyrock.ning.com/forum/topics/mmsa-drunk-bdsm-spanking-story
adult knee over amateur bdsm spanking - http://www.studentuk.com/forum/topics/adult-knee-over-amateur-bdsm
adult knee over pitiless bdsm spanking - http://comunidad.todotnv.com/forum/topics/adult-knee-over-pitiless-bdsm
mmsa beautiful bdsm spanking story - http://carolinescomedy.ning.com/forum/topics/mmsa-beautiful-bdsm-spanking
adult knee over merciless bdsm spanking - http://www.jijisweet.com/forum/topics/adult-knee-over-merciless-bdsm
mmsa disgusting bdsm spanking story - http://www.youthcabinet.org/forum/topics/mmsa-disgusting-bdsm-spanking
adult knee over cruel bdsm spanking - http://3dmuziqnation.ning.com/forum/topics/adult-knee-over-cruel-bdsm
mmsa enjoyable bdsm spanking story - http://community.shoe4africa.org/profiles/blogs/mmsa-enjoyable-bdsm-spanking
adult knee over uncompromising bdsm spanking - http://www.718unlimited.com/forum/topics/adult-knee-over-uncompromising
adult knee over mature bdsm spanking - http://carolinescomedy.ning.com/forum/topics/adult-knee-over-mature-bdsm
mmsa elegant bdsm spanking story - http://therealtaylormomsen.com/forum/topics/mmsa-elegant-bdsm-spanking
mmsa delicious bdsm spanking story - http://www.mcafeonline.com/forum/topics/mmsa-delicious-bdsm-spanking
adult knee over relentless bdsm spanking - http://www.startupspace.com/profiles/blogs/adult-knee-over-relentless
adult knee over implacable bdsm spanking - http://www.mcafeonline.com/forum/topics/adult-knee-over-implacable
mmsa cute bdsm spanking story - http://www.nashville.net/profiles/blogs/mmsa-cute-bdsm-spanking-story
mmsa dirty bdsm spanking story - http://comunidad.todotnv.com/forum/topics/mmsa-dirty-bdsm-spanking-story
mmsa dangerous bdsm spanking story - http://www.blogyourtravel.com/forum/topics/mmsa-dangerous-bdsm-spanking

# xNsdfnLHNF652412

11/11/2010 6:11 PM by misterpoll inexorable femdom spanking and diaper p
misterpoll mature femdom spanking and diaper punishment - http://www.jijisweet.com/forum/topics/misterpoll-mature-femdom-1
misterpoll powerful femdom spanking and diaper punishment - http://www.myamericanism.com/profiles/blogs/misterpoll-powerful-femdom-1
adult hot femdom spanking and enema - http://gospeltoday.ning.com/profiles/blogs/adult-hot-femdom-spanking-and
adult dangerous femdom spanking and enema - http://www.nashville.net/profiles/blogs/adult-dangerous-femdom
adult amazing femdom spanking and enema - http://philly1.com/forum/topics/adult-amazing-femdom-spanking
misterpoll fierce femdom spanking and diaper punishment - http://comunidad.todotnv.com/forum/topics/misterpoll-fierce-femdom-1
adult painful femdom spanking and enema - http://www.snowboarder-community.com/forum/topics/adult-painful-femdom-spanking
adult extreme femdom spanking and enema - http://jaredsrenegadefashion.ning.com/forum/topics/adult-extreme-femdom-spanking
adult abject femdom spanking and enema - http://www.thepatriotcaucus.net/forum/topics/adult-abject-femdom-spanking
misterpoll outrageous femdom spanking and diaper punishment - http://www.startupspace.com/profiles/blogs/misterpoll-outrageous-femdom-1
adult advanced femdom spanking and enema - http://www.martinatopleybird.com/forum/topics/adult-advanced-femdom-spanking
misterpoll kinky femdom spanking and diaper punishment - http://www.718unlimited.com/forum/topics/misterpoll-kinky-femdom-1
adult drunk femdom spanking and enema - http://www.718unlimited.com/forum/topics/adult-drunk-femdom-spanking
adult bisexual femdom spanking and enema - http://carolinescomedy.ning.com/forum/topics/adult-bisexual-femdom-spanking
misterpoll remorseless femdom spanking and diaper punishment - http://www.certifiedsouljas.com/forum/topics/misterpoll-remorseless-femdom-1
adult depraved femdom spanking and enema - http://www.mcafeonline.com/forum/topics/adult-depraved-femdom-spanking
adult delicious femdom spanking and enema - http://3dmuziqnation.ning.com/forum/topics/adult-delicious-femdom
adult naked femdom spanking and enema - http://coloradodaily.ning.com/forum/topics/adult-naked-femdom-spanking-1
misterpoll cruel femdom spanking and diaper punishment - http://www.dreambighustlehard.com/forum/topics/misterpoll-cruel-femdom-1
misterpoll amateur femdom spanking and diaper punishment - http://suzyrock.ning.com/forum/topics/misterpoll-amateur-femdom-1
misterpoll implacable femdom spanking and diaper punishment - http://www.inkedinc.net/forum/topics/misterpoll-implacable-femdom-1
adult absolute femdom spanking and enema - http://www.tripflix.com/forum/topics/adult-absolute-femdom-spanking
misterpoll brutal femdom spanking and diaper punishment - http://community.shoe4africa.org/profiles/blogs/misterpoll-brutal-femdom-1
misterpoll merciless femdom spanking and diaper punishment - http://community.bigkenny.tv/profiles/blogs/misterpoll-merciless-femdom-1
adult beautiful femdom spanking and enema - http://www.studentuk.com/forum/topics/adult-beautiful-femdom
adult devastating femdom spanking and enema - http://suzyrock.ning.com/forum/topics/adult-devastating-femdom
misterpoll ruthless femdom spanking and diaper punishment - http://atlclubs.ning.com/forum/topics/misterpoll-ruthless-femdom-1
misterpoll atrocious femdom spanking and diaper punishment - http://therealtaylormomsen.com/forum/topics/misterpoll-atrocious-femdom-1
misterpoll insane femdom spanking and diaper punishment - http://www.mcafeonline.com/forum/topics/misterpoll-insane-femdom-1

# xNsdfnLHNF143522

11/11/2010 10:02 PM by monkey dangerous spanking game
monkey hot spanking game - http://therealtaylormomsen.com/forum/topics/monkey-hot-spanking-game
monkey naked spanking game - http://community.bigkenny.tv/profiles/blogs/monkey-naked-spanking-game
adult dangerous spanking chat sin - http://www.nashville.net/profiles/blogs/adult-dangerous-spanking-chat
adult amazing spanking chat sin - http://philly1.com/forum/topics/adult-amazing-spanking-chat
adult delicious spanking chat sin - http://3dmuziqnation.ning.com/forum/topics/adult-delicious-spanking-chat
monkey amateur spanking game - http://comunidad.todotnv.com/forum/topics/monkey-amateur-spanking-game
monkey cute spanking game - http://www.snowboarder-community.com/forum/topics/monkey-cute-spanking-game
monkey black spanking game - http://www.mypetmove.com/forum/topics/monkey-black-spanking-game
monkey beautiful spanking game - http://atlclubs.ning.com/forum/topics/monkey-beautiful-spanking-game
adult elegant spanking chat sin - http://community.shoe4africa.org/profiles/blogs/adult-elegant-spanking-chat
monster naked femdom spanking straight video - http://www.myamericanism.com/profiles/blogs/monster-naked-femdom-spanking
adult bisexual spanking chat sin - http://carolinescomedy.ning.com/forum/topics/adult-bisexual-spanking-chat
adult devastating spanking chat sin - http://suzyrock.ning.com/forum/topics/adult-devastating-spanking-1
monkey crazy spanking game - http://distortion2static.ning.com/forum/topics/monkey-crazy-spanking-game
adult naked spanking chat sin - http://coloradodaily.ning.com/forum/topics/adult-naked-spanking-chat-sin
monkey absolute spanking game - http://www.inkedinc.net/forum/topics/monkey-absolute-spanking-game
monkey bloody spanking game - http://www.kiwipulse.co.nz/profiles/blogs/monkey-bloody-spanking-game
monkey extreme spanking game - http://community.shoe4africa.org/profiles/blogs/monkey-extreme-spanking-game
adult beautiful spanking chat sin - http://www.studentuk.com/forum/topics/adult-beautiful-spanking-chat
adult dark spanking chat sin - http://www.blogyourtravel.com/forum/topics/adult-dark-spanking-chat-sin
monkey amazing spanking game - http://www.certifiedsouljas.com/forum/topics/monkey-amazing-spanking-game
adult drunk spanking chat sin - http://www.718unlimited.com/forum/topics/adult-drunk-spanking-chat-sin
adult enjoyable spanking chat sin - http://www.startupspace.com/profiles/blogs/adult-enjoyable-spanking-chat
monkey painful spanking game - http://www.startupspace.com/profiles/blogs/monkey-painful-spanking-game
adult disgusting spanking chat sin - http://comunidad.todotnv.com/forum/topics/adult-disgusting-spanking-chat
monkey abject spanking game - http://www.dreambighustlehard.com/forum/topics/monkey-abject-spanking-game
adult dirty spanking chat sin - http://www.myamericanism.com/profiles/blogs/adult-dirty-spanking-chat-sin
adult dire spanking chat sin - http://www.jijisweet.com/forum/topics/adult-dire-spanking-chat-sin
adult depraved spanking chat sin - http://www.mcafeonline.com/forum/topics/adult-depraved-spanking-chat

# xNsdfnLHNF685269

11/11/2010 11:16 PM by montrose academy fantastic bdsm spanking
montrose academy cute bdsm spanking - http://www.myamericanism.com/profiles/blogs/montrose-academy-cute-bdsm
adult disgusting bdsm spanking dvd - http://philly1.com/forum/topics/adult-disgusting-bdsm-spanking
adult mature bdsm spanking dvd - http://www.718unlimited.com/forum/topics/adult-mature-bdsm-spanking-dvd
montrose academy drunk bdsm spanking - http://therealtaylormomsen.com/forum/topics/montrose-academy-drunk-bdsm
montrose academy crazy bdsm spanking - http://www.jijisweet.com/forum/topics/montrose-academy-crazy-bdsm
adult dire bdsm spanking dvd - http://www.tripflix.com/forum/topics/adult-dire-bdsm-spanking-dvd
adult devastating bdsm spanking dvd - http://www.thepatriotcaucus.net/forum/topics/adult-devastating-bdsm
montrose academy bloody bdsm spanking - http://suzyrock.ning.com/forum/topics/montrose-academy-bloody-bdsm
adult insane bdsm spanking dvd - http://www.blogyourtravel.com/forum/topics/adult-insane-bdsm-spanking-dvd
montrose academy dire bdsm spanking - http://www.inkedinc.net/forum/topics/montrose-academy-dire-bdsm
adult fierce bdsm spanking dvd - http://www.jijisweet.com/forum/topics/adult-fierce-bdsm-spanking-dvd
montrose academy black bdsm spanking - http://www.718unlimited.com/forum/topics/montrose-academy-black-bdsm
montrose academy depraved bdsm spanking - http://community.shoe4africa.org/profiles/blogs/montrose-academy-depraved-bdsm
adult dirty bdsm spanking dvd - http://www.martinatopleybird.com/forum/topics/adult-dirty-bdsm-spanking-dvd
montrose academy devastating bdsm spanking - http://www.dreambighustlehard.com/forum/topics/montrose-academy-devastating
montrose academy enjoyable bdsm spanking - http://atlclubs.ning.com/forum/topics/montrose-academy-enjoyable
adult frantic bdsm spanking dvd - http://www.nashville.net/profiles/blogs/adult-frantic-bdsm-spanking
montrose academy delicious bdsm spanking - http://www.startupspace.com/profiles/blogs/montrose-academy-delicious
montrose academy explicit bdsm spanking - http://www.mypetmove.com/forum/topics/montrose-academy-explicit-bdsm
adult elegant bdsm spanking dvd - http://carolinescomedy.ning.com/forum/topics/adult-elegant-bdsm-spanking
adult double bdsm spanking dvd - http://coloradodaily.ning.com/forum/topics/adult-double-bdsm-spanking-dvd
montrose academy disgusting bdsm spanking - http://www.certifiedsouljas.com/forum/topics/montrose-academy-disgusting
adult enjoyable bdsm spanking dvd - http://www.studentuk.com/forum/topics/adult-enjoyable-bdsm-spanking
adult powerful bdsm spanking dvd - http://suzyrock.ning.com/forum/topics/adult-powerful-bdsm-spanking
montrose academy dangerous bdsm spanking - http://comunidad.todotnv.com/forum/topics/montrose-academy-dangerous
adult drunk bdsm spanking dvd - http://gospeltoday.ning.com/profiles/blogs/adult-drunk-bdsm-spanking-dvd
montrose academy double bdsm spanking - http://community.bigkenny.tv/profiles/blogs/montrose-academy-double-bdsm
adult amateur bdsm spanking dvd - http://www.mcafeonline.com/forum/topics/adult-amateur-bdsm-spanking-1
adult kinky bdsm spanking dvd - http://3dmuziqnation.ning.com/forum/topics/adult-kinky-bdsm-spanking-dvd

# xNsdfnLHNF965536

11/12/2010 12:11 AM by mood picture painful bdsm spanking
adult relentless spanking fetish - http://www.kiwipulse.co.nz/profiles/blogs/adult-relentless-spanking
mood picture ruthless spanking - http://suzyrock.ning.com/forum/topics/mood-picture-ruthless-spanking
adult hot bdsm spanking fetish - http://philly1.com/forum/topics/adult-hot-bdsm-spanking-fetish
mood picture naked spanking - http://community.shoe4africa.org/profiles/blogs/mood-picture-naked-spanking
adult absolute bdsm spanking fetish - http://www.studentuk.com/forum/topics/adult-absolute-bdsm-spanking
mood picture merciless spanking - http://www.718unlimited.com/forum/topics/mood-picture-merciless
adult advanced bdsm spanking fetish - http://carolinescomedy.ning.com/forum/topics/adult-advanced-bdsm-spanking
mood picture uncompromising spanking - http://3dmuziqnation.ning.com/forum/topics/mood-picture-uncompromising
adult painful bdsm spanking fetish - http://www.tripflix.com/forum/topics/adult-painful-bdsm-spanking
mood picture remorseless spanking - http://www.mcafeonline.com/forum/topics/mood-picture-remorseless
mood picture fierce spanking - http://carolinescomedy.ning.com/forum/topics/mood-picture-fierce-spanking
mood picture implacable spanking - http://www.blogyourtravel.com/forum/topics/mood-picture-implacable
mood picture inexorable spanking - http://www.myamericanism.com/profiles/blogs/mood-picture-inexorable
adult extreme bdsm spanking fetish - http://www.martinatopleybird.com/forum/topics/adult-extreme-bdsm-spanking
adult black bdsm spanking fetish - http://www.nashville.net/profiles/blogs/adult-black-bdsm-spanking
mood picture relentless spanking - http://comunidad.todotnv.com/forum/topics/mood-picture-relentless
adult crazy bdsm spanking fetish - http://3dmuziqnation.ning.com/forum/topics/adult-crazy-bdsm-spanking
adult naked spanking fetish - http://jaredsrenegadefashion.ning.com/forum/topics/adult-naked-spanking-fetish
mood picture amateur bdsm spanking - http://therealtaylormomsen.com/forum/topics/mood-picture-amateur-bdsm
adult ebony bdsm spanking fetish - http://www.thepatriotcaucus.net/forum/topics/adult-ebony-bdsm-spanking
mood picture pitiless spanking - http://www.jijisweet.com/forum/topics/mood-picture-pitiless-spanking
mood picture cruel spanking - http://www.nashville.net/profiles/blogs/mood-picture-cruel-spanking
adult rough spanking fetish - http://www.snowboarder-community.com/forum/topics/adult-rough-spanking-fetish
adult amateur bdsm spanking fetish - http://gospeltoday.ning.com/profiles/blogs/adult-amateur-bdsm-spanking
adult cute bdsm spanking fetish - http://www.mcafeonline.com/forum/topics/adult-cute-bdsm-spanking
mood picture ebony bdsm spanking - http://www.dreambighustlehard.com/forum/topics/mood-picture-ebony-bdsm
adult bloody bdsm spanking fetish - http://www.blogyourtravel.com/forum/topics/adult-bloody-bdsm-spanking
mood picture rough spanking - http://www.startupspace.com/profiles/blogs/mood-picture-rough-spanking
adult sadistic spanking fetish - http://distortion2static.ning.com/forum/topics/adult-sadistic-spanking-fetish

# xNsdfnLHNF547941

11/12/2010 12:58 AM by mood pictures bloody bdsm spanking
adult dangerous bdsm spanking forum - http://jaredsrenegadefashion.ning.com/forum/topics/adult-dangerous-bdsm-spanking
mood pictures naked bdsm spanking - http://www.718unlimited.com/forum/topics/mood-pictures-naked-bdsm
adult cute bdsm spanking forum - http://www.snowboarder-community.com/forum/topics/adult-cute-bdsm-spanking-forum
mood pictures black bdsm spanking - http://www.myamericanism.com/profiles/blogs/mood-pictures-black-bdsm
mood pictures abject bdsm spanking - http://www.nashville.net/profiles/blogs/mood-pictures-abject-bdsm
mood pictures advanced bdsm spanking - http://3dmuziqnation.ning.com/forum/topics/mood-pictures-advanced-bdsm
adult depraved bdsm spanking forum - http://www.tripflix.com/forum/topics/adult-depraved-bdsm-spanking
mood pictures amazing bdsm spanking - http://www.mcafeonline.com/forum/topics/mood-pictures-amazing-bdsm
mood pictures rough spanking - http://coloradodaily.ning.com/forum/topics/mood-pictures-rough-spanking
mood pictures absolute bdsm spanking - http://www.blogyourtravel.com/forum/topics/mood-pictures-absolute-bdsm
mood pictures sadistic spanking - http://philly1.com/forum/topics/mood-pictures-sadistic
adult beautiful bdsm spanking forum - http://atlclubs.ning.com/forum/topics/adult-beautiful-bdsm-spanking
adult devastating bdsm spanking forum - http://philly1.com/forum/topics/adult-devastating-bdsm
mood pictures relentless spanking - http://www.martinatopleybird.com/forum/topics/mood-pictures-relentless
adult black bdsm spanking forum - http://www.mypetmove.com/forum/topics/adult-black-bdsm-spanking
mood pictures inexorable spanking - http://www.tripflix.com/forum/topics/mood-pictures-inexorable
mood pictures naked spanking - http://www.studentuk.com/forum/topics/mood-pictures-naked-spanking
adult absolute bdsm spanking forum - http://www.inkedinc.net/forum/topics/adult-absolute-bdsm-spanking
adult amazing bdsm spanking forum - http://www.certifiedsouljas.com/forum/topics/adult-amazing-bdsm-spanking
mood pictures beautiful bdsm spanking - http://suzyrock.ning.com/forum/topics/mood-pictures-beautiful-bdsm
adult crazy bdsm spanking forum - http://distortion2static.ning.com/forum/topics/adult-crazy-bdsm-spanking
adult naked bdsm spanking forum - http://community.bigkenny.tv/profiles/blogs/adult-naked-bdsm-spanking
adult abject bdsm spanking forum - http://www.dreambighustlehard.com/forum/topics/adult-abject-bdsm-spanking
mood pictures bisexual bdsm spanking - http://www.jijisweet.com/forum/topics/mood-pictures-bisexual-bdsm
mood pictures amateur bdsm spanking - http://carolinescomedy.ning.com/forum/topics/mood-pictures-amateur-bdsm
adult dark bdsm spanking forum - http://gospeltoday.ning.com/profiles/blogs/adult-dark-bdsm-spanking-forum
adult bloody bdsm spanking forum - http://www.kiwipulse.co.nz/profiles/blogs/adult-bloody-bdsm-spanking
adult delicious bdsm spanking forum - http://www.thepatriotcaucus.net/forum/topics/adult-delicious-bdsm-spanking
adult drunk bdsm spanking forum - http://www.martinatopleybird.com/forum/topics/adult-drunk-bdsm-spanking

# xNsdfnLHNF701232

11/12/2010 5:23 AM by more slap slappin smack smackin spank spankin
adult extreme bdsm spanking movie - http://www.nashville.net/profiles/blogs/adult-extreme-bdsm-spanking
adult remorseless spanking movie - http://gospeltoday.ning.com/profiles/blogs/adult-remorseless-spanking
adult pitiless spanking movie - http://www.martinatopleybird.com/forum/topics/adult-pitiless-spanking-movie
adult rough spanking movie - http://carolinescomedy.ning.com/forum/topics/adult-rough-spanking-movie
adult sadistic spanking movie - http://www.studentuk.com/forum/topics/adult-sadistic-spanking-movie
more slap slappin smack smackin spank spankin - http://www.inkedinc.net/forum/topics/more-slap-slappin-smack-3
more slap slappin smack smackin spank spankin - http://www.718unlimited.com/forum/topics/more-slap-slappin-smack-3
more slap slappin smack smackin spank spankin - http://therealtaylormomsen.com/forum/topics/more-slap-slappin-smack-3
adult hot bdsm spanking movie - http://www.blogyourtravel.com/forum/topics/adult-hot-bdsm-spanking-movie
adult ruthless spanking movie - http://www.tripflix.com/forum/topics/adult-ruthless-spanking-movie
more slap slappin smack smackin spank spankin - http://www.mcafeonline.com/forum/topics/more-slap-slappin-smack-3
more slap slappin smack smackin spank spankin - http://comunidad.todotnv.com/forum/topics/more-slap-slappin-smack-3
more slap slappin smack smackin spank spankin - http://www.blogyourtravel.com/forum/topics/more-slap-slappin-smack-3
more slap slappin smack smackin spank spankin - http://community.shoe4africa.org/profiles/blogs/more-slap-slappin-smack-3
more slap slappin smack smackin spank spankin - http://www.certifiedsouljas.com/forum/topics/more-slap-slappin-smack-3
adult amazing bdsm spanking movie - http://suzyrock.ning.com/forum/topics/adult-amazing-bdsm-spanking
more slap slappin smack smackin spank spankin - http://www.nashville.net/profiles/blogs/more-slap-slappin-smack-3
adult merciless spanking movie - http://www.thepatriotcaucus.net/forum/topics/adult-merciless-spanking-movie
adult absolute bdsm spanking movie - http://www.mcafeonline.com/forum/topics/adult-absolute-bdsm-spanking
more slap slappin smack smackin spank spankin - http://www.dreambighustlehard.com/forum/topics/more-slap-slappin-smack-3
adult inexorable spanking movie - http://philly1.com/forum/topics/adult-inexorable-spanking
more slap slappin smack smackin spank spankin - http://www.jijisweet.com/forum/topics/more-slap-slappin-smack-3
more slap slappin smack smackin spank spankin - http://www.myamericanism.com/profiles/blogs/more-slap-slappin-smack-3
more slap slappin smack smackin spank spankin - http://3dmuziqnation.ning.com/forum/topics/more-slap-slappin-smack-3
adult advanced bdsm spanking movie - http://www.718unlimited.com/forum/topics/adult-advanced-bdsm-spanking
more slap slappin smack smackin spank spankin - http://suzyrock.ning.com/forum/topics/more-slap-slappin-smack-3
adult relentless spanking movie - http://coloradodaily.ning.com/forum/topics/adult-relentless-spanking
adult naked bdsm spanking movie - http://www.jijisweet.com/forum/topics/adult-naked-bdsm-spanking
adult abject bdsm spanking movie - http://3dmuziqnation.ning.com/forum/topics/adult-abject-bdsm-spanking

# xNsdfnLHNF927199

11/17/2010 8:36 AM by diaper hot spankings
public drunk femdom spankings - http://www.dreambighustlehard.com/forum/topics/public-drunk-femdom-spankings
bernies uncompromising bdsm spanking - http://gospeltoday.ning.com/profiles/blogs/bernies-uncompromising-bdsm
explicit femdom spanking on line - http://community.shoe4africa.org/profiles/blogs/explicit-femdom-spanking-on
brutal fantastic spanking picture - http://www.snowboarder-community.com/forum/topics/brutal-fantastic-spanking
girl black spanking videos - http://jaredsrenegadefashion.ning.com/forum/topics/girl-black-spanking-videos
fantastic spanking boarding school - http://www.myamericanism.com/profiles/blogs/fantastic-spanking-boarding
jessica advanced bdsm spanking teen - http://www.thepatriotcaucus.net/forum/topics/jessica-advanced-bdsm-spanking
group cruel bdsm spanking yahoo - http://www.blogyourtravel.com/forum/topics/group-cruel-bdsm-spanking
self administered elegant bdsm spankings punishment - http://www.certifiedsouljas.com/forum/topics/self-administered-elegant-bdsm
gay bloody spanking pic - http://www.studentuk.com/forum/topics/gay-bloody-spanking-pic
saxon beautiful femdom spanking web - http://comunidad.todotnv.com/forum/topics/saxon-beautiful-femdom
asking for a black bdsm spanking - http://www.nashville.net/profiles/blogs/asking-for-a-black-bdsm
delicious femdom spanking jenny - http://www.inkedinc.net/forum/topics/delicious-femdom-spanking-1
free online uncompromising bdsm spanking videos - http://www.tripflix.com/forum/topics/free-online-uncompromising
female brutal femdom spanking men stories - http://carolinescomedy.ning.com/forum/topics/female-brutal-femdom-spanking
wife drunk spanking husbands - http://3dmuziqnation.ning.com/forum/topics/wife-drunk-spanking-husbands
husband drunk spanking wife video - http://www.martinatopleybird.com/forum/topics/husband-drunk-spanking-wife
fierce spanking video clips free - http://distortion2static.ning.com/forum/topics/fierce-spanking-video-clips
sex pic absolute femdom spanking - http://suzyrock.ning.com/forum/topics/sex-pic-absolute-femdom
school bloody bdsm spanking uniform - http://www.mcafeonline.com/forum/topics/school-bloody-bdsm-spanking
can get i devastating bdsm spanking where - http://coloradodaily.ning.com/forum/topics/can-get-i-devastating-bdsm
man man painful femdom spanking - http://philly1.com/forum/topics/man-man-painful-femdom
black bdsm spanking movies online - http://www.snowboarder-community.com/forum/topics/black-bdsm-spanking-movies
mainstream rough bdsm spankings - http://www.mcafeonline.com/forum/topics/mainstream-rough-bdsm
forceful bdsm spanking clubs - http://therealtaylormomsen.com/forum/topics/forceful-bdsm-spanking-clubs
hard hairbrush sadistic bdsm spankings - http://3dmuziqnation.ning.com/forum/topics/hard-hairbrush-sadistic-bdsm
otk enjoyable femdom spanking picturers - http://atlclubs.ning.com/forum/topics/otk-enjoyable-femdom-spanking
preteen dirty femdom spanking stories - http://www.718unlimited.com/forum/topics/preteen-dirty-femdom-spanking
elegant femdom spanking blog erotic - http://community.bigkenny.tv/profiles/blogs/elegant-femdom-spanking-blog

# xNsdfnLHNF672595

11/18/2010 4:08 AM by gave him a enjoyable femdom spanking
lesbian pitiless femdom spanking - http://www.myamericanism.com/profiles/blogs/lesbian-pitiless-femdom
sacerdote implacable spanking scene - http://community.bigkenny.tv/profiles/blogs/sacerdote-implacable-spanking
painful femdom spanking fan fiction - http://www.certifiedsouljas.com/forum/topics/painful-femdom-spanking-fan
dire femdom spanking bare bottoms - http://3dmuziqnation.ning.com/forum/topics/dire-femdom-spanking-bare
boy explicit spanking drawings art - http://3dmuziqnation.ning.com/forum/topics/boy-explicit-spanking-drawings
domination fetish free movie merciless spanking - http://www.mcafeonline.com/forum/topics/domination-fetish-free-movie
insane bdsm spanking children is good - http://www.dreambighustlehard.com/forum/topics/insane-bdsm-spanking-children
maman outrageous spanking - http://www.inkedinc.net/forum/topics/maman-outrageous-spanking
free humiliation forceful bdsm spanking story - http://community.shoe4africa.org/profiles/blogs/free-humiliation-forceful-bdsm
film hollywood in scene savage femdom spanking - http://atlclubs.ning.com/forum/topics/film-hollywood-in-scene-savage
gentlemanly art of amazing spanking the woman you love - http://www.snowboarder-community.com/forum/topics/gentlemanly-art-of-amazing
chubby male extreme spanking - http://community.bigkenny.tv/profiles/blogs/chubby-male-extreme-spanking
gay male black femdom spanking stories - http://www.certifiedsouljas.com/forum/topics/gay-male-black-femdom-spanking
abject spanking competition - http://therealtaylormomsen.com/forum/topics/abject-spanking-competition
wife bloody femdom spanking movies - http://comunidad.todotnv.com/forum/topics/wife-bloody-femdom-spanking
crazy femdom spanking than worse yelling - http://community.shoe4africa.org/profiles/blogs/crazy-femdom-spanking-than
bondage handcuffs brutal spanking vids whipping - http://suzyrock.ning.com/forum/topics/bondage-handcuffs-brutal
disgusting femdom spanking video clips free - http://atlclubs.ning.com/forum/topics/disgusting-femdom-spanking
extreme implacable spanking movies - http://therealtaylormomsen.com/forum/topics/extreme-implacable-spanking
whipping relentless bdsm spanking - http://www.myamericanism.com/profiles/blogs/whipping-relentless-bdsm
jessica mature femdom spanking - http://www.dreambighustlehard.com/forum/topics/jessica-mature-femdom-spanking
harry potter merciless femdom spanking stories - http://comunidad.todotnv.com/forum/topics/harry-potter-merciless-femdom
enjoyable bdsm spanking clip - http://suzyrock.ning.com/forum/topics/enjoyable-bdsm-spanking-clip
male dirty spanking males - http://distortion2static.ning.com/forum/topics/male-dirty-spanking-males
amazing spanking schoolgirl top 100 - http://www.snowboarder-community.com/forum/topics/amazing-spanking-schoolgirl
parents dirty spanking kids - http://www.inkedinc.net/forum/topics/parents-dirty-spanking-kids
online hot femdom spanking video - http://jaredsrenegadefashion.ning.com/forum/topics/online-hot-femdom-spanking
pay savage femdom spanking video view - http://www.mcafeonline.com/forum/topics/pay-savage-femdom-spanking
sorority abject bdsm spanking picture - http://distortion2static.ning.com/forum/topics/sorority-abject-bdsm-spanking

# re: Een eerste blik op LINQ

12/23/2010 12:35 PM by roids
This is very informative story and great comments.

Post Comment

Title  
Name  
Url
Comment   

ATTENTION: the code you need to copy is CaSe SeNsItIvE and is required to prevent spam.
Enter the code you see: