Daten mithilfe des SDK für .NET abfragen
Das SDK für .NET bietet mehrere Methoden zum Abfragen von Daten. Jede hat verschiedene Vorteile.
Methode | Vorteile |
---|---|
FetchExpression | Verwenden Sie cie Eigenschaft FetchXML zur Erstellung von Abfragen, die Aggregate zurückgeben, wie etwa die Summe eines Wertes für alle zurückgegebenen Datensätze. Sie können mit FetchXML auch Gruppierungsvorgänge ausführen. Kann Daten aus verknüpften Tabellenzeilen (Entitätsdatensätzen) enthalten. |
QueryExpression | Sie haben ein stark typisiertes Objektmodell, um komplexer Abfragen zu erstellen. Unterstützt alle FetchXML-Funktionen, ausgenommen Aggregate und Gruppierung. Kann Daten aus verknüpften Tabellenzeilen (Entitätsdatensätzen) enthalten. |
QueryByAttribute | Ein einfacheres Objektmodel als QueryExpression Verwenden Sie QueryByAttribute für Abfragen, bei denen Sie testen, ob alle Wertkriterien für Tabellenspalten (Attribute) in Ihrer Abfrage übereinstimmen. Kann nur Daten aus einer einzelnen Tabelle (Entitätstyp) zurückgeben. |
LINQ | OrganizationServiceContext.QueryProvider vverwenden. zum Abfragen mithilfe der gängigen LINQ-Syntax verfassen. Alle LINQ-Abfragen werden in QueryExpression konvertiert, um die von Ihnen verwendeten Funktionen zu beschränken, die für QueryExpression verfügbar sind In diesem Artikel stehen die Stile von Abfragen im Mittelpunkt, die zu SDK-Assemblyklassen verfügbar sind. Weitere Informationen: Erstellen von Abfragen mit LINQ (.NET Sprache integrierte Abfrage) |
FetchExpression, QueryExpression, znd QueryByAttribute stammen von QueryBase abstrakten Klassen. Es gibt zwei Möglichkeiten, um Ergebnisse einer Abfrage anzuzeigen, die mit dieser Klassen definiert wird:
- Sie können eine dieser Instanz Klassen als
query
Parameter für IOrganizationServiceRetrieveMultiple nutzen Methode. - Sie können die Query Eigenschaft der RetrieveMultipleRequest Klasse und die IOrganizationService.Execute nutzen Methode.
Hinweis
Im IOrganizationService.RetrieveMultiple Methode wird grundsätzlich bevorzugt. Es gibt keine speziellen Funktionen, die für die Verwendung der RetrieveMultipleRequest-Klasse erforderlich sind.
Beide Möglichkeiten geben EntityCollection zurück, das die Ergebnisse der Abfrage in der Sammlung Entities und in den Eigenschaften enthält, um zusätzliche Abfragen zu verwenden, um ausgelagerte Ergebnisse zu erhalten.
Hinweis
Um die Leistung zu optimieren, kann jede Abfrageanforderung maximal 5.000 Zeilen zurückgeben. Um zum größeren Resultatset zurückzugeben müssen Sie weitere Seiten anfordern.
Alle Filterbedingungen für String-Werte sind unabhängig von der Groß-/Kleinschreibung.
Tabellenspalten mit Nullwerten werden nicht zurückgegeben.
Wenn eine Tabellenspalte (Entitätsattribut) einen Nullwert enthält oder wenn das Attribut nicht in den FetchXml-Attributen enthalten war oder im ColumnSet, der Entity.Attributes Sammlung das Attribut nicht. Es gibt keinen Schlüssel, um darauf zuzugreifen oder zurückzugeben. Das Fehlen des Attributs gibt an, dass es Null ist. Bei Verwendung des früh gebundenen Stils wird dies von den generierten Entity
-Klasseneigenschaften verwaltet ein Nullwert wird zurückgegeben.
Wenn Sie bei Verwendung der späten Bindung versuchen, den Wert mit einem Indexer in den Sammlungen Attributes oder FormattedValues aufzurufen, wird eine The given key was not present in the dictionary
mit der Nachricht KeyNotFoundException angezeigt.
Um dieses Problem zu vermeiden, wenn Sie die späte Bindung nutzen, können Sie zwei Strategien verwenden:
Verwenden Sie für ein Attribut, das nicht zulässig sein kann, die Entity.Contains(String)- Methode, um zu überprüfen, ob das Attribut, das mit einem Indexer zuzugreift, ungültig ist. Beispiel:
Money revenue = (entity.Contains("revenue")? entity["revenue"] : null);
Entity.GetAttributeValue<T>(String) vverwenden. um auf den Wert zuzugreifen. Beispiel:
Money revenue = entity.GetAttributeValue<Money>();
Hinweis
Wenn der mit GetAttributeValue<T>(String) angegebene Typ ein Werttyp ist, der nicht NULL sein darf, z. B. Boolean oder DateTime , ist der zurückgegebene Wert der Standardwert, z. B. false
oder 1/1/0001 12:00:00 AM
anstatt NULL.
Verwendung von FetchXML mit FetchExpression
FetchXml ist eine proprietäre XML-basiert Abfragesprache, die mit SDK Assemblyabfragen mithilfe von FetchExpression und durch die WEB API mithilfe einer Abfragezeichenfolge fetchXml
verwendet werden kann. Weitere Informationen: Daten mithilfe von FetchXML abfragen
Das folgende Beispiel zeigt eine einfache Abfrage, um bis zu 50 übereinstimmende Kontozeilen zurückzugeben, in denen der Wert address1_city
gleich Redmond
ist, sortiert nach name
.
string fetchXml = @"
<fetch top='50' >
<entity name='account' >
<attribute name='name' />
<filter>
<condition
attribute='address1_city'
operator='eq'
value='Redmond' />
</filter>
<order attribute='name' />
</entity>
</fetch>";
var query = new FetchExpression(fetchXml);
EntityCollection results = svc.RetrieveMultiple(query);
results.Entities.ToList().ForEach(x => {
Console.WriteLine(x.Attributes["name"]);
});
Wichtig
Beim Abrufen von Tabellenzeilen sollten Sie nur die benötigten Spaltenwerte anfordern, indem Sie die spezifischen Attribute mit attribute
-Elementen angeben und nicht mit dem all-attributes
-Element für die Rückgabe aller Attribute.
Weitere Informationen:
- Daten mithilfe von FetchXml abfragen
- Über Schnellsuche-Abfragen
- Ergebnisse mithilfe von FetchXml auslagern
- Daten mithilfe von FetchXML aggregieren
- Beispiel: Verwendung von Aggregation in FetchXML
- Beispiel: Verwenden von FetchXML mit einem Auslagerungscookie
QueryExpression nutzen
Diese QueryExpression-Klasse stellt einen Satz stark typisierter Objekte dar, die für Ablaufmanipulation von Abfragen optimiert wird.
Das folgende Beispiel zeigt eine einfache Abfrage, um bis zu 50 übereinstimmende Kontozeilen zurückzugeben, in denen der Wert address1_city
gleich Redmond
ist, sortiert nach name
.
var query = new QueryExpression("account")
{
ColumnSet = new ColumnSet("name"),
Criteria = new FilterExpression(LogicalOperator.And),
TopCount = 50
};
query.Criteria.AddCondition("address1_city", ConditionOperator.Equal, "Redmond");
query.AddOrder("name", OrderType.Ascending);
EntityCollection results = svc.RetrieveMultiple(query);
results.Entities.ToList().ForEach(x =>
{
Console.WriteLine(x.Attributes["name"]);
});
Wichtig
Beim Abrufen von Zeilen sollten Sie nur die benötigten Spaltenwerte anfordern, indem Sie die spezifischen Attribute mit dem Klassenkonstruktor ColumnSet angeben. Obwohl ColumnSet-Klassenkonstruktor eine Überladung bietet, die einem Booleschen Parameter allColumns
annimmt, sollten Sie dies im Produktionscode nicht verwenden.
Weitere Informationen:
- Erstellen von Abfragen mit QueryExpression
- Auslagern von umfangreichen Ergebnissätzen mit QueryExpression
- Verwenden der QueryExpression-Klasse
- Verwenden der ConditionExpression-Klasse
- Verwenden der ColumnSet-Klasse
- Die FilterExpression-Klasse verwenden
- Beispiel: Rufen Sie mit der QueryExpressions-Klasse Vielfaches ab
- Beispiel: Verwenden von QueryExpression mit einem Auslagerungscookie
QueryByAttribute nutzen
Die Klasse QueryByAttribute stellt einen stark typisierten Satz von Objekten bereit, der für einfache, häufige Abfragen von Tabellenzeilen optimiert ist. Im Gegensatz zu FetchXML und QueryExpression
kann QueryByAttribute
nur Daten aus einer einzelnen Tabelle zurückgeben. Sie ermöglicht nicht das Abrufen von Daten aus verknüpften Tabellenzeilen oder komplexe Abfragekriterien.
Das folgende Beispiel zeigt eine einfache Abfrage, um bis zu 50 übereinstimmende Kontozeilen zurückzugeben, in denen der Wert address1_city
gleich Redmond
ist, sortiert nach name
.
var query = new QueryByAttribute("account")
{
TopCount = 50,
ColumnSet = new ColumnSet("name")
};
query.AddAttributeValue("address1_city", "Redmond");
query.AddOrder("name", OrderType.Ascending);
EntityCollection results = svc.RetrieveMultiple(query);
results.Entities.ToList().ForEach(x =>
{
Console.WriteLine(x.Attributes["name"]);
});
Weitere Informationen:
- Verwenden der QueryByAttribute-Klasse
- Beispiel: Abruf von Vielfachen mit der QueryByAttribute-Klasse
Zugriff auf formatierte Werte
Unabhängig von der Methode, die Sie zum Abfragen von Tabellen verwenden, werden die Daten als EntityCollection.Entities zurückgegeben. Sie können auf die Datenwerte der Tabellenspalte (Attribute) zugreifen, indem Sie Entity.Attributes verwenden. Sammlung Aber diese Werte können vom Typ als Zeichenfolge, die Sie bearbeiten möchten abhängen, um Zeichenfolgenwerte abzurufen, die Sie in der Anwendung anzeigen möchten.
Sie können auf eichenfolgenwerte zugreifen, die die Umgebungseinstellungen zum Formatieren verwenden, da Werte im Entity.FormattedValues verwendet werden Sammlung
Im folgenden Beispiel wird gezeigt, wie Sie auf die gesammelten formatierten Zeichenfolgenwerte für die folgenden Firmaenattribute zugreifen:
Logischer Name des Attributs | Art |
---|---|
primarycontactid |
EntityReference |
createdon |
DateTime |
revenue |
Money |
statecode |
OptionSetValue |
var query = new QueryByAttribute("account")
{
TopCount = 50,
ColumnSet = new ColumnSet("name", "primarycontactid", "createdon", "revenue", "statecode")
};
query.AddAttributeValue("address1_city", "Redmond");
query.AddOrder("name", OrderType.Ascending);
EntityCollection results = svc.RetrieveMultiple(query);
results.Entities.ToList().ForEach(x =>
{
Console.WriteLine(@"
name:{0}
primary contact: {1}
created on: {2}
revenue: {3}
status: {4}",
x.Attributes["name"],
(x.Contains("primarycontactid")? x.FormattedValues["primarycontactid"]:string.Empty),
x.FormattedValues["createdon"],
(x.Contains("revenue") ? x.FormattedValues["revenue"] : string.Empty),
x.FormattedValues["statecode"]
);
});
Hinweis
Tabellenspalten (Attribute), die Nullwerte enthalten, werden in der Abfrage Attributes
oder in FormattedValues
-Sammlungen nicht zurückgegeben. Wenn eine Spalte einen Nullwert enthalten kann, sollten Sie dies mit der Methode Contains überprüfen, bevor Sie versuchen, auf den Wert zuzugreifen.
Die formattierten Ergebnisse werden wie folgt angezeigt:
name:A Datum (sample)
primary contact: Rene Valdes (sample)
created on: 2/28/2018 11:04 AM
revenue: $10,000.000
status: Active
name:City Power & Light (sample)
primary contact: Scott Konersmann (sample)
created on: 2/28/2018 11:04 AM
revenue: $100,000.000
status: Active
name:Contoso Pharmaceuticals (sample)
primary contact: Robert Lyon (sample)
created on: 2/28/2018 11:04 AM
revenue: $60,000.000
status: Active
Konvertieren von Abfragen zwischen FetchXML und QueryExpression
Sie können QueryExpression-Abfragen in FetchXml und FetchXml-Abfragen in QueryExpression konvertieren, indem Sie die Klassen QueryExpressionToFetchXmlRequest und FetchXmlToQueryExpressionRequest verwenden.
Die Tabelle SavedQuery speichert Systemansichten für eine Tabelle (Entitätstyp) und die Tabelle UserQuery speichert gespeicherte Benutzerabfragen. Andere Tabellen können eine Abfrage auch als FetchXml-Zeichenfolge speichern. Diese Methoden ermöglichen das Konvertieren einer FetchXml-Zeichenfolge in QueryExpression, sodass sie mit dem Objektmodell bearbeitet und dann wieder in FetchXml konvertiert werden und somit als Zeichenfolge gespeichert werden kann.
Weitere Informationen: Beispiel: Konvertieren von Abfragen zwischen Fetch und QueryExpression
Grenzwerte für Abfragebedingungen
Dataverse hat einen Grenzwert von insgesamt 500 zulässigen Bedingungen in einer Abfrage. Alle Joins, die in der Abfrage enthalten sind, werden zu diesem Grenzwert hinzugezählt. Wenn eine Abfrage (und ihre Joins) 500 Bedingungen überschreitet, erhält der Benutzer beim Ausführen der Abfrage die folgende Fehlermeldung: „Die Anzahl der Bedingungen in der Abfrage hat den maximalen Grenzwert überschritten.“
In diesem Fall muss ein Benutzer entweder:
- Reduzieren Sie die Anzahl der Bedingungen in der Abfrage.
- Verwenden Sie die In-Klausel, die GUIDs und Zeichenfolgen mit bis zu 850 Zeichen ohne einen Grenzwert für Ganzzahlen zulässt.
Hinweis
Können Sie uns Ihre Präferenzen für die Dokumentationssprache mitteilen? Nehmen Sie an einer kurzen Umfrage teil. (Beachten Sie, dass diese Umfrage auf Englisch ist.)
Die Umfrage dauert etwa sieben Minuten. Es werden keine personenbezogenen Daten erhoben. (Datenschutzbestimmungen).
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für