Comparaison requête Linq et code compilé
I Requêtes ne renvoyant qu’un seul résultat :
Le type est automatiquement déduit (même avant compilation, il suffit de passer la souris sur le mot clé var pour s’en apercevoir)
|
// SELECTION D'UN SEUL ELEMENT
var Query =
(from c in LstContacts
where
c.ContactName.StartsWith("A")
select
c).First<Contact>();
Contact Query
= this.LstContacts.Where<Contact>(delegate(Contact c)
{
return
c.ContactName.StartsWith("A");
}).First<Contact>();
|
|
// COUNT
var Query =
(from c in LstContacts
where c.ContactAge <
40
select
c).Count<Contact>();
int Query = this.LstContacts.Where<Contact>(delegate(Contact
c)
{
return (c.ContactAge <
40);
}).Count<Contact>();
|
I I Requêtes renvoyant une liste :
Les « clauses » se succèdent avec :
On distingue les « clauses »(SELECT,WHERE ,ORDERBY,etc.)qui utilsent un delegate,, et les méthodes(exemple :First()) qui sont appelées directement
1 – SELECT seulement si pas de where
2 – WHERE puis ORDERBY (pas de WHERE !!)
3 – des l’instant que la clause ORDERBY est présente le résultat est stocké dans un IOrderedSequence, sinon il est stocké dans un IEnumerable
A – SELECT SIMPLE
Le delegate ne fait que retourné un objet du type attendu (ici Contact)
|
// SELECT simple (pas de where ni orderby)
var Query =
from c in LstContacts
select c;
IEnumerable<Contact> Query = this.LstContacts.Select<Contact, Contact>(delegate(Contact c)
{
return c;
});
|
B– SELECT AVEC CLAUSE WHERE
Le delegate effectue un filtre, seuls les objets correspondant à la condition (true) seront pris
|
// AVEC UNE CLAUSE WHERE
var Query =
from
c in LstContacts
where
c.ContactName.StartsWith("A")
select c;
IEnumerable<Contact> Query = this.LstContacts.Where<Contact>(delegate(Contact c)
{
return
c.ContactName.StartsWith("A");
});
|
C– SELECT AVEC ORDERBY
Le delegate définie la propriété sur laquelle repose le trie
|
// AVEC ORDER BY
var Query =
from c in
LstContacts
orderby c.ContactName
select c;
IOrderedSequence<Contact> Query = this.LstContacts.OrderBy<Contact, string>(delegate(Contact c)
{
return c.ContactName;
});
// ou
this.dataGridView1.DataSource = this.LstContacts.OrderBy<Contact, string>(delegate(Contact c)
{
return c.ContactName;
}).ToList<Contact>();
|
D– SELECT AVEC CLAUSE WHERE ET ORDERBY
|
//
var Query =
from c in LstContacts
where
c.ContactName.StartsWith("A")
orderby c.ContactName
select c;
IOrderedSequence<Contact> Query = this.LstContacts.Where<Contact>(delegate(Contact c)
{
return
c.ContactName.StartsWith("A");
}).OrderBy<Contact, string>(delegate(Contact c)
{
return c.ContactName;
});
|
E – AVEC PREDICATE
|
// PREDICATE
var Query =
LstContacts.FindAll(FindContactsWhereContactNameStartsWith);
//
List<Contact> Query = this.LstContacts.FindAll(new Predicate<Contact>(this.FindContactsWhereContactNameStartsWith));
//
var Query =
from c in LstContacts.FindAll(FindContactsWhereContactNameStartsWith)
select c;
IEnumerable<Contact> Query =
this.LstContacts.FindAll(new Predicate<Contact>(this.FindContactsWhereContactNameStartsWith))
.Select<Contact,
Contact>(delegate(Contact c)
{
return c;
});
public bool FindContactsWhereContactNameStartsWith(Contact c)
{
if (c.ContactName.StartsWith("A"))
return true;
else
return false;
}
|
F – AND ET OR (&& et ||)
C’est dans le délégué que les conditions sont traitées conjointement
|
// AND
var Query =
from c in LstContacts
where
c.ContactName.StartsWith("A") && c.ContactName.StartsWith("B")
select c;
IEnumerable<Contact> Query = this.LstContacts.Where<Contact>(delegate(Contact c)
{
return
c.ContactName.StartsWith("A") && c.ContactName.StartsWith("B");
});
// OR
var Query2 =
from c in
LstContacts
where c.ContactName.StartsWith("A") || c.ContactName.StartsWith("B")
select c;
IEnumerable<Contact> Query2 = this.LstContacts.Where<Contact>(delegate(Contact c)
{
return
c.ContactName.StartsWith("A") || c.ContactName.StartsWith("B");
});
|
Plusieurs champs de trie
|
var Query =
from c in
LstContacts
orderby c.ContactID, c.ContactName
select c;
IOrderedSequence<Contact> Query = this.LstContacts.OrderBy<Contact, int>(delegate(Contact c)
{
return c.ContactID;
})
.ThenBy<Contact,
string>(delegate(Contact c)
{
return c.ContactName;
});
|
G - Les Nullables
|
var Query =
from c in
LstContacts
orderby c.ContactAge
select c;
IOrderedSequence<Contact> Query = this.LstContacts.OrderBy<Contact, int?>(delegate(Contact c)
{
return c.ContactAge;
});
|
H - Création dynamique d’objets
- Avec new (Query)
- Avec initialisateurs d’objets (Query2)
|
var Query =
from c in
LstContacts
where c.ContactName.StartsWith("A")
select new
Contact(c.ContactID,c.ContactName,c.ContactAge,null);
IEnumerable<Contact> Query = this.LstContacts.Where<Contact>(delegate(Contact c)
{
return
c.ContactName.StartsWith("A");
}).Select<Contact, Contact>(delegate(Contact c)
{
return new Contact(c.ContactID, c.ContactName, c.ContactAge, null);
});
var Query2 =
from c in
LstContacts
where c.ContactName.StartsWith("A")
select new
Contact { ContactID = -1, ContactName = c.ContactName, ContactAge = c.ContactAge, ContactBirth = null };
IEnumerable<Contact> Query2 = this.LstContacts.Where<Contact>(delegate(Contact c)
{
return
c.ContactName.StartsWith("A");
}).Select<Contact, Contact>(delegate(Contact c)
{
return new Contact { ContactID = -1, ContactName = c.ContactName, ContactAge = c.ContactAge, ContactBirth = null };
});
|
I - Avec expression Lambda
|
Contact oContact = LstContacts.First((Contact c) =>
c.ContactName.StartsWith("A"));
Contact oContact = this.LstContacts.First<Contact>(delegate(Contact
c)
{
return
c.ContactName.StartsWith("A");
});
|
J - Func
|
Func<Contact, bool>
ContactFunction = c => c.ContactName.StartsWith("A");
// les func sont en fait converties en
méthodes anonymes(delegate)
Func<Contact, bool> ContactFunction = delegate(Contact c)
{
return
c.ContactName.StartsWith("A");
};
|
et comme la on commence à mieux comprendre comment fonctionne Linq on peut faire :
Func<Contact, bool> ContactFunction = c =>
c.ContactName.StartsWith("A");
var Query =
from c in LstContacts
where
ContactFunction(c)
select c;
|