Exemple de code QueryExpression
Pour essayer d’utiliser QueryExpression avec C#, vous pouvez utiliser la OutputQueryExpression
méthode statique de cet article en adaptant le Démarrage rapide : Exécuter un SDK pour une requête .NET (C#).
Notes
Voir Exemple de cookie de pagination pour un exemple de code permettant de récupérer des données dans des pages.
Vous pouvez utiliser la méthode statique OutputQueryExpression
suivante pour tester les requêtes QueryExpression dans une application console.
La OutputQueryExpression
méthode montre comment utiliser la classe QueryExpression et la méthode IOrganizationService.RetrieveMultiple pour renvoyer une EntityCollection contenant les données demandées.
La OutputQueryExpression
méthode dépend du ConsoleTables NuGet package et nécessite que toutes les LinkEntity les instances qui contiennent des colonnes spécifient un EntityAlias.
/// <summary>
/// Renders the output of a query in a table for a console application
/// </summary>
/// <param name="service">The authenticated IOrganizationService instance to use.</param>
/// <param name="query">The query to use</param>
/// <exception cref="Exception">
/// OutputQueryExpression requires all LinkEntity instances that contain columns specify an EntityAlias property.
/// </exception>
static void OutputQueryExpression(IOrganizationService service, QueryExpression query)
{
//Retrieve the data
EntityCollection entityCollection = service.RetrieveMultiple(query: query);
//Get column names from the query
var columns = GetQueryExpressionColumns(query);
// Create the table using https://www.nuget.org/packages/ConsoleTables/2.5.0
var table = new ConsoleTables.ConsoleTable(columns.ToArray());
// Add the rows of the table
entityCollection.Entities.ToList().ForEach(entity =>
{
table.Rows.Add(GetRowValues(columns, entity).ToArray());
});
// Write the table to the console
table.Write();
// Get a list of column names from the query
List<string> GetQueryExpressionColumns(QueryExpression query)
{
List<string> columns = new();
columns.AddRange(GetColumns(query.ColumnSet));
foreach (LinkEntity linkEntity in query.LinkEntities)
{
columns.AddRange(GetLinkEntityColumns(linkEntity));
}
return columns;
}
// Get column names from any linked tables
List<string> GetLinkEntityColumns(LinkEntity linkEntity)
{
if (string.IsNullOrWhiteSpace(linkEntity.EntityAlias))
{
if (linkEntity.Columns.Columns.Count != 0)
{
string message = "OutputQueryExpressionRequest requires all ";
message += "LinkEntity instances that contain columns ";
message += "specify an EntityAlias property.";
throw new Exception(message);
}
}
List<string> columns = new();
columns.AddRange(GetColumns(linkEntity.Columns, linkEntity.EntityAlias));
foreach (LinkEntity le in linkEntity.LinkEntities)
{
columns.AddRange(GetColumns(le.Columns, le.EntityAlias));
}
return columns;
}
// Get columns from a columnset
List<string> GetColumns(ColumnSet columnset, string alias = null)
{
List<string> columns = new();
foreach (string column in columnset.Columns)
{
columns.Add(string.IsNullOrWhiteSpace(alias) ? column : $"{alias}.{column}");
}
foreach (XrmAttributeExpression item in columnset.AttributeExpressions)
{
columns.Add(item.Alias ?? item.AttributeName);
}
return columns;
}
// Get the values of a row as strings
List<string> GetRowValues(List<string> columns, Entity entity)
{
List<string> values = new();
columns.ForEach(column =>
{
if (entity.Attributes.ContainsKey(column))
{
// Use the formatted value if it available
if (entity.FormattedValues.ContainsKey(column))
{
values.Add($"{entity.FormattedValues[column]}");
}
else
{
// When an alias is used, the Aliased value must be converted
if (entity.Attributes[column] is AliasedValue aliasedValue)
{
// When an EntityReference doesn't have a Name, show the Id
if (aliasedValue.Value is EntityReference lookup &&
string.IsNullOrWhiteSpace(lookup.Name))
{
values.Add($"{lookup.Id:B}");
}
else
{
values.Add($"{aliasedValue.Value}");
}
}
else
{
// Use the simple attribute value
values.Add($"{entity.Attributes[column]}");
}
}
}
// Null values are not in the Attributes collection
else
{
values.Add("NULL");
}
});
return values;
}
}
Mettre à jour l’exemple de démarrage rapide du SDK pour .NET
Vous pouvez adapter l’exemple Démarrage rapide : exécuter une requête du SDK pour .NET (C#) pour tester les requêtes en procédant comme suit :
Installez le package NuGet ConsoleTables
Ajoutez la syntaxe suivante à l’aide des instructions en haut du fichier
program.cs
using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Query; using System.Text; using System.Xml.Linq;
Copiez et collez la méthode
OutputQueryExpression
sous la méthodeMain
.Modifiez la méthode
Main
pour définir votre requête et utiliser la méthodeOutputQueryExpression
.static void Main(string[] args) { using (ServiceClient serviceClient = new(connectionString)) { if (serviceClient.IsReady) { //WhoAmIResponse response = // (WhoAmIResponse)serviceClient.Execute(new WhoAmIRequest()); //Console.WriteLine("User ID is {0}.", response.UserId); QueryExpression query = new("account") { TopCount = 5, ColumnSet = new ColumnSet( "accountclassificationcode", "createdby", "createdon", "name") }; OutputQueryExpression(serviceClient, query); } else { Console.WriteLine( "A web service connection was not established."); } } // Pause the console so it does not close. Console.WriteLine("Press the <Enter> key to exit."); Console.ReadLine(); }
Lorsque vous exécutez le programme à l’aide de la méthode OutputQueryExpression
, la sortie doit ressembler à ceci :
---------------------------------------------------------------------------------------------------------
| accountclassificationcode | createdby | createdon | name |
---------------------------------------------------------------------------------------------------------
| Default Value | FirstName LastName | 3/25/2023 10:42 AM | Litware, Inc. (sample) |
---------------------------------------------------------------------------------------------------------
| Default Value | FirstName LastName | 3/25/2023 10:42 AM | Adventure Works (sample) |
---------------------------------------------------------------------------------------------------------
| Default Value | FirstName LastName | 3/25/2023 10:42 AM | Fabrikam, Inc. (sample) |
---------------------------------------------------------------------------------------------------------
| Default Value | FirstName LastName | 3/25/2023 10:42 AM | Blue Yonder Airlines (sample) |
---------------------------------------------------------------------------------------------------------
| Default Value | FirstName LastName | 3/25/2023 10:42 AM | City Power & Light (sample) |
---------------------------------------------------------------------------------------------------------
Articles associés
Interroger les données à l’aide de QueryExpression
Exemple : récupération multiple avec la classe QueryExpression
Exemple : Utiliser QueryExpression avec un cookie de pagination