Partager via


Utiliser LINQ pour créer une requête

Le fournisseur de requêtes Language-Integrated Query (LINQ) .NET dans Microsoft Dataverse utilise une syntaxe LINQ standard. La première étape dans le cadre de la création d’une requête LINQ consiste à identifier les types de tables pertinentes et les relations entre elles. Vous pouvez ensuite spécifier la source de données et les autres paramètres de requête.

La clause from est utilisée pour renvoyer une seule table « racine ». Le fournisseur de requêtes ne peut renvoyer que des lignes d’un seul type de table. Les clauses orderby et select doivent faire référence à cette table racine. Vous pouvez utiliser les clauses join pour ajouter des lignes avec une relation à la table « racine ».

Opérateurs LINQ

Toutes les expressions de requête LINQ ont un format similaire. Les sections suivantes indiquent les clauses les plus courantes dans une expression de requête LINQ lors de l’utilisation du fournisseur de requêtes LINQ des applications Dataverse.

from

En cas d’utilisation du contexte de service généré et de la liaison anticipée, utilisez le groupe de tables IQueryable, tel que AccountSet, dans le contexte généré.

En l’absence d’utilisation du contexte généré, la méthode CreateQuery sur l’objet de contexte de service vous permet d’accéder aux lignes de tables Dataverse.

Exemple :

Utilisation du contexte de service généré :

var query1 = from c in context.ContactSet  
select c;  

Utilisation de la méthode CreateQuery :

var query1 = from c in context.CreateQuery<Contact>()  
select c;  

join

La clause join représente une jointure interne. Vous utilisez la clause pour travailler avec deux, voire plusieurs tables qui peuvent être jointes avec une valeur de colonne courante.

Exemple :

from c in context.ContactSet  
join a in context.AccountSet on c.ContactId equals a.PrimaryContactId.Id  

La clause where applique un filtre aux résultats, souvent à l’aide d’une expression booléenne. Le filtre spécifie les éléments à exclure de la séquence source. Chaque clause where ne peut contenir que des conditions par rapport à un seul type de table. Une condition composite impliquant plusieurs tables n’est pas valide. En revanche, chaque table doit être filtrée dans des clauses distinctes where.

Exemple :

from a in context.AccountSet  
where (a.Name.StartsWith("Contoso") && a.Address1_StateOrProvince == "WA")  

orderby

L’opérateur orderby place les colonnes de la requête renvoyée dans un ordre spécifique.

Exemple :

var query1 = from c in context.CreateQuery<Contact>()     
    orderby c.FullName ascending     
    select c;  
foreach ( var q in query1)     
{  
    Console.WriteLine(q.FirstName + " " + q.LastName);     
}  

sélectionner

La clause select définit la forme des données renvoyées. La clause crée un groupe de colonnes basé sur les résultats de l’expression de requête. Vous pouvez également définir une instance d’un nouvel objet avec lequel travailler. L’objet créé à l’aide de la clause select n’est pas créé sur le serveur, mais est une instance locale.

Exemple :

select new Contact     
{  
    ContactId = c.ContactId,  
    FirstName = c.FirstName,  
    LastName = c.LastName,  
    Address1_Telephone1 = c.Address1_Telephone1     
};  

Limitations LINQ

Le fournisseur de requêtes LINQ prend en charge un sous-ensemble des opérateurs LINQ. Les conditions pouvant être exprimées dans LINQ ne sont pas toutes prises en charge. Le tableau suivant indique certaines des limites des opérateurs LINQ de base.

Opérateur LINQ Limitations
join Représente une jointure interne ou externe. Seuls les jointures externes de gauche sont prises en charge.
from Prend en charge une clause from par requête.
where À gauche de la clause doit figurer un nom de colonne et à sa droite doit figurer une valeur. Vous ne pouvez pas définir une constante à gauche. Les deux parties de la clause ne peuvent pas être des constantes.

Prend en charge les fonctions String Contains, StartsWith, EndsWithet Equals.
groupBy Non pris en charge. FetchXML prend en charge les options de regroupement qui ne sont pas disponibles avec le fournisseur de requêtes LINQ. Plus d’informations : Agréger des données à l’aide de FetchXmlAgréger des données à l’aide de FetchXml
orderBy Prend en charge le tri par colonne de table, tel que Contact.FullName.
select Prend en charge les types, constructeurs et initialiseurs anonymes.
last L’opérateur last n’est pas pris en charge.
skip et take Prend en charge skip et take à l’aide de la pagination côté serveur. La valeur skip doit être supérieure ou égale à la valeur take.
aggregate Non pris en charge. FetchXML prend en charge les options d’agrégation qui ne sont pas disponibles avec le fournisseur de requêtes LINQ. Plus d’informations : Agréger des données à l’aide de FetchXml

Filtrer plusieurs tables

Vous pouvez créer des requêtes Language Integrated Query (LINQ) .NET complexes dans Dataverse. Vous utilisez plusieurs clauses Join avec des clauses de filtre pour créer un résultat qui est filtré sur les colonnes à partir de plusieurs tables.

L’exemple suivant indique comment créer une requête LINQ qui fonctionne avec deux tables et qui filtre le résultat basé sur des valeurs issues de chacune des lignes de table.

using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
{
var query_where3 = from c in svcContext.ContactSet
 join a in svcContext.AccountSet
 on c.ContactId equals a.PrimaryContactId.Id
 where a.Name.Contains("Contoso")
 where c.LastName.Contains("Smith")
 select new
 {
  account_name = a.Name,
  contact_name = c.LastName
 };

foreach (var c in query_where3)
{
 System.Console.WriteLine("acct: " +
  c.account_name +
  "\t\t\t" +
  "contact: " +
  c.contact_name);
}
}

Voir aussi

Générer des requêtes avec LINQ (Language-Integrated Query .NET)
Utiliser la classe d’entités à liaison tardive avec une requête LINQ
Trier les résultats à l’aide des colonnes de table avec LINQ
Mettre en page d’importants ensembles de résultats avec LINQ
Exemple : Interrogation des données à l’aide de LINQ
Exemples de requêtes LINQ utilisant OrganizationServiceContext avec Microsoft Dataverse

Notes

Pouvez-vous nous indiquer vos préférences de langue pour la documentation ? Répondez à un court questionnaire. (veuillez noter que ce questionnaire est en anglais)

Le questionnaire vous prendra environ sept minutes. Aucune donnée personnelle n’est collectée (déclaration de confidentialité).