Abfrageschemadefinitionen
Anwendungen, die mit Dataverse erstellt wurden, müssen in der Lage sein, sich an Änderungen an Schemadefinitionen anzupassen. Neue Tabellen, Spalten, Beziehungen und Beschriftungen können über die Konfiguration oder durch Importieren einer Lösung hinzugefügt oder geändert werden. Da Anwendungen auf diese Änderungen reagieren müssen, sind sie beim Start häufig darauf angewiesen, Schemadefinitionen abzurufen. Die Gesamtmenge an Daten, die das Schema von einer Dataverse-Organisation beschreibt, kann sehr groß sein. Sie müssen in der Lage sein, genau die Daten zu erhalten, die Sie benötigen.
Die RetrieveMetadataChanges
-Nachricht bietet zwei Möglichkeiten:
- Anfrage: Erstellen Sie eine einzelne Abfrage, um nur die Schemadaten abzurufen, die Sie benötigen. Dieser Artikel konzentriert sich auf das Verfassen von Abfragen.
- Cache-Verwaltung: Wenn Sie die Schemadefinitionsdaten mit Ihrer App zwischenspeichern, können Sie mit
RetrieveMetadataChanges
effizient nur die Änderungen seit Ihrer letzten Abfrage abrufen. Verwenden Sie die Informationen zu diesen Änderungen, um Elemente in Ihrem Cache hinzuzufügen oder zu entfernen. Zwischenspeichern kann zu einer erheblichen Verbesserung der Startzeit Ihrer Anwendung führen. Cache-Management wird in Cache-Schemadaten behandelt.
Werten Sie andere Optionen aus, um Schemadefinitionen abzurufen
Beim Erstellen einer Abfrage zum Abrufen von Schemadefinitionen bietet die RetrieveMetadataChanges
-Nachricht den Vorteil, eine einzelne Anforderung zu definieren, die mehrere Tabellendefinitionen umfassen und Details für abgeleitete Typen zurückgeben und einen Cache im Laufe der Zeit verwalten kann.
Die folgende Tabelle fasst andere Möglichkeiten zum Abrufen von Schemadefinitionen zusammen, aber keine davon bietet Funktionen zum Verwalten eines Caches im Laufe der Zeit.
Nachricht | Beschreibung und Einschränkungen |
---|---|
RetrieveAllEntities |
Ruft Daten für alle Tabellen ab, einschließlich aller Spalten,Rechte und Beziehungen, wenn Sie dies wünschen. Siehe: RetrieveAllEntitiesRequest- und RetrieveAllEntitiesResponse-Klassen. Einschränkungen: Sie können zwar den Parameter EntityFilters verwenden, um einige Teile auszuschließen, dies ist jedoch ein sehr kostspieliger Vorgang. |
RetrieveEntity |
Sie können die Definition jeder einzelnen Tabelle abrufen, einschließlich aller Spalten, Berechtigungen und Beziehungen, wenn Sie dies wünschen. Siehe: Abrufen und Aktualisieren einer Tabelle Einschränkungen: Sie können zwar den Parameter EntityFilters verwenden, um einige Daten auszuschließen, Sie können jedoch nicht auswählen, welche spezifischen Eigenschaften Sie wünschen, dies ist dennoch ein kostspieliger Vorgang. |
RetrieveAttribute |
Sie können die vollständige Definition jedes einzelnen Attributs abrufen. Siehe: Abrufen einer Spalte Einschränkungen: Sie können die gewünschten Eigenschaften nicht auswählen. |
RetrieveRelationship |
Sie können die vollständige Definition jeder einzelnen Beziehung abrufen. Siehe: Abrufen von Tabellenbeziehungen Einschränkungen: Sie können die gewünschten Eigenschaften nicht auswählen. |
RetrieveAllOptionSets |
Sie können Informationen zu allen in der Organisation definierten globalen Auswahlmöglichkeiten abrufen. Siehe: Einfügen, Aktualisieren, Löschen und Sortieren globaler Auswahlmöglichkeiten Einschränkungen: Auswahlmöglichkeiten, die nur lokal innerhalb einer Spalte definiert sind, sind nicht enthalten. |
RetrieveEntityKey |
Sie können die Definition für alle alternativen Schlüssel für eine bestimmte Tabelle abrufen. Siehe: Abrufen und Löschen von Alternativschlüsseln |
Basis-RetrieveMetadataChanges-Beispiel
Ein einfaches Beispiel dafür, was Sie mit RetrieveMetadataChanges
machen können. Vergleichen Sie das, mit dem, was Sie mit der Web-API und dem EntityDefinitions
-Entitätssatz tun können.
Mit der Web-API können Sie eine Abfrage wie folgt erstellen:
GET [Organization URI]/api/data/v9.2/EntityDefinitions?$select=SchemaName&$filter=LogicalName eq 'account' or LogicalName eq 'contact'&$expand=Attributes($select=LogicalName;$filter=IsValidForCreate eq true)
Diese Abfrage gibt Daten sowohl aus den Firma- als auch aus den Kontakttabellendefinitionen zurück und erweitert alle Spaltendefinitionen, bei denen IsValidForCreate
wahr ist.
Die folgenden Beispiele zeigen, wie Sie dieselbe Abfrage mit RetrieveMetadataChanges
erstellen.
/// <summary>
/// Get the SchemaName for the account and contact tables together with
/// the LogicalName of any attributes which are valid for create
/// </summary>
/// <param name="service"></param>
static void SimpleRetrieveMetadataChangesExample(IOrganizationService service) {
var query = new EntityQueryExpression
{
Properties = new MetadataPropertiesExpression("SchemaName", "Attributes"),
Criteria = new MetadataFilterExpression(filterOperator: LogicalOperator.Or)
{
Conditions = {
{
new MetadataConditionExpression(
propertyName:"LogicalName",
conditionOperator: MetadataConditionOperator.Equals,
value:"account")
},
{
new MetadataConditionExpression(
propertyName:"LogicalName",
conditionOperator: MetadataConditionOperator.Equals,
value:"contact")
}
},
},
AttributeQuery = new AttributeQueryExpression
{
Properties = new MetadataPropertiesExpression("LogicalName"),
Criteria = new MetadataFilterExpression(filterOperator: LogicalOperator.And)
{
Conditions = {
{
new MetadataConditionExpression(
propertyName:"IsValidForCreate",
conditionOperator: MetadataConditionOperator.Equals,
value:true)
}
}
}
},
LabelQuery = new LabelQueryExpression {
FilterLanguages = {
{ 1033 }
}
}
};
var request = new RetrieveMetadataChangesRequest
{
Query = query
};
var response = (RetrieveMetadataChangesResponse)service.Execute(request);
response.EntityMetadata.ToList().ForEach(em => {
Console.WriteLine($"Entity SchemaName:{em.SchemaName}");
em.Attributes.ToList().ForEach(a => {
Console.WriteLine($"\tAttribute LogicalName:{a.LogicalName}");
});
});
}
Ausgabe:
Entity SchemaName:Account
Attribute LogicalName:emailaddress3
Attribute LogicalName:emailaddress1
Attribute LogicalName:address1_city
<List truncated for brevity>
Entity SchemaName:Contact
Attribute LogicalName:contactid
Attribute LogicalName:emailaddress3
Attribute LogicalName:emailaddress2
<List truncated for brevity>
Erstellen Sie Abfrage mit EntityQueryExpression
Verwenden Sie EntityQueryExpression
, um die RetrieveMetadataChanges
-Query
-Eigenschaft festzulegen.
EntityQueryExpression hat die folgenden Eigenschaften:
Eigenschaften | Type | Beschreibung des Dataflows |
---|---|---|
Properties |
MetadataPropertiesExpression | Stellen Sie PropertyNames auf eine Liste mit Eigenschaftsnamen ein, die zurückgegeben werden sollen. Oder Sie können AllProperties auf wahr festlegen, um alle Eigenschaften zurückzugeben. Bei Artikeln, die über diese verfügen, müssen Sie die Eigenschaftennamen MetadataId , LogicalName oder HasChanged nicht hinzufügen. Diese Eigenschaften werden immer berücksichtigt. |
Criteria |
MetadataFilterExpression | Siehe Begrenzen Sie die zurückgegebenen Daten mit MetadataFilterExpression |
AttributeQuery |
AttributeQueryExpression | Folgt dem gleichen Muster wie EntityQueryExpression . AttributeQueryExpression hat auch Properties und Criteria , um zu steuern, welche Spaltendefinitionen zurückgegeben werden sollen.Hinweis: Wenn Sie AttributeQuery verwenden, muss Attributes eine der Properties sein, die für die EntityQueryExpression angefordert werden. |
RelationshipQuery |
RelationshipQueryExpression | Folgt dem gleichen Muster wie EntityQueryExpression . RelationshipQueryExpression hat auch Properties und Criteria , um zu steuern, welche Beziehungsdefinitionen zurückgegeben werden sollen.Hinweis: Wenn Sie RelationshipQuery , OneToManyRelationships , ManyToOneRelationships oder ManyToManyRelationships verwenden, müssen sie eine der Properties sein, die für die EntityQueryExpression angefordert werden. |
KeyQuery |
EntityKeyQueryExpression | Folgt dem gleichen Muster wie EntityQueryExpression . EntityKeyQueryExpression hat auch Properties und Criteria , um zu steuern, welche Alternativschlüsseldefinitionen zurückgegeben werden sollen.Hinweis: Wenn Sie KeyQuery verwenden, muss Keys eine der Properties sein, die für die EntityQueryExpression angefordert werden. |
LabelQuery |
LabelQueryExpression | Verwenden Sie die FilterLanguages -Eigenschaft, um die zurückgegebenen Sprachen einzuschränken. Wenn in einer Organisation viele Sprachen bereitgestellt werden, erhalten Sie Beschriftungen für alle Sprachen, die die zurückgegebenen Daten erheblich erweitern könnten. Wenn Ihre App für einen einzelnen Benutzer bestimmt ist, sollten Sie den bevorzugten LCID-Sprachcode des Benutzers angeben. Siehe Rufen Sie den bevorzugten Sprachcode des Benutzers ab |
Hinweis
Der Query
-Parameter ist optional. Sie können also RetrieveMetadataChanges
ohne Filter verwenden, aber dies entspricht der Verwendung von RetrieveAllEntities
. Eine sehr teure Operation.
Begrenzen Sie die zurückgegebenen Daten mit MetadataFilterExpression
Verwenden Sie MetadataFilterExpression für die Criteria
Eigenschaften für EntityQueryExpression, AttributeQueryExpression, RelationshipQueryExpression und EntityKeyQueryExpression.
MetadataFilterExpression
hat die folgenden Eigenschaften:
Eigenschaften | Type | Beschreibung des Dataflows |
---|---|---|
FilterOperator |
LogicalOperator | Steuert, wie Conditions ausgewertet werden. Entweder And oder Or . |
Conditions |
DataCollection<MetadataConditionExpression> | Eine Sammlung von auszuwertenden Bedingungen.. Siehe Legen Sie Bedingungen mit MetadataConditionExpression fest |
Filters |
DataCollection<MetadataFilterExpression> | Weitere anzuwendende Filter für eine komplexere Abfrage. |
Legen Sie Bedingungen mit MetadataConditionExpression fest
Verwenden Sie MetadataConditionExpression für die MetadataFilterExpression Conditions
-Eigenschaften.
MetadataConditionExpression
hat die folgenden Eigenschaften:
Eigenschaften | Type | Beschreibung des Dataflows |
---|---|---|
ConditionOperator |
MetadataConditionOperator | Beschreibt den Vergleichstyp, der auf die Value -Eigenschaft angewendet werden soll. |
PropertyName |
string | Der Name der zu auszuwertenden Eigenschaft |
Value |
object | Der zu vergleichende Wert (oder die Werte) |
Im Allgemeinen können Sie nur Eigenschaften verwenden, die einfache Datentypen, Aufzählungen, BooleanManagedProperty oder AttributeRequiredLevelManagedProperty in einem MetadataFilterExpression
darstellen. Sie können keine Bedingungen für Eigenschaften festlegen, bei denen es sich um Sammlungen oder Beschriftungen handelt. Wenn eine BooleanManagedProperty
oder AttributeRequiredLevelManagedProperty
angegeben ist, kann nur die Eigenschaft Value
ausgewertet werden. Filterung für AttributeMetadata.SourceType-Eigenschaft wird nicht unterstützt.
MetadataConditionOperator-Aufzählungswerte
Die MetadataConditionOperator
-Aufzählung hat die folgenden Mitglieder:
Feld | Beschreibung |
---|---|
Equals |
Die Werte werden auf Gleichheit verglichen. |
NotEquals |
Die beiden Werte sind nicht gleich. |
In |
Der Wert ist ein einer Werteliste vorhanden. |
NotIn |
Der angegebene Wert stimmt nicht mit einem Wert in einer Liste überein. |
GreaterThan |
Der Wert ist größer als der Vergleichswert. |
LessThan |
Der Wert ist kleiner als der Vergleichswert. |
Zurückgegebene Prozessdaten
RetrieveMetadataChangesResponse hat folgende Eigenschaften:
Eigenschaften | Type | Beschreibung des Dataflows |
---|---|---|
EntityMetadata |
EntityMetadataCollection | Die angeforderte Tabellendefinition. Wenn Sie Daten abfragen oder einen Cache initialisieren, kann dieser Wert genauso behandelt werden wie die Antwort aus der RetrieveAllEntities -Nachricht. Wenn Sie auf eine bestimmte Spalten-, Beziehungs- oder Alternativschlüsseldefinition zugreifen möchten, müssen Sie die Tabellendefinition zurückgeben, die diese enthält. |
ServerVersionStamp |
string |
Ein Zeitstempelbezeichner für die abgerufenen Metadaten. Wenn Sie einen Cache mit Schemadefinitionen verwalten, verwenden Sie diesen Wert als ClientVersionStamp -Eigenschaft in nachfolgenden Anforderungen, sodass nur die Änderungen seit der vorherigen Anforderung zurückgegeben werden. |
DeletedMetadata |
DeletedMetadataCollection | Daten für die seit der letzten Anfrage gelöschten Elemente. Dieser Wert enthält nur Daten, wenn RetrieveMetadataChanges mit den Parametern ClientVersionStamp und DeletedMetadataFilters gesendet wird. Weitere Informationen finden Sie unter Cache-Schemadaten |
Rufen Sie den bevorzugten Sprachcode des Benutzers ab
Die folgenden Beispiele zeigen, wie Sie den bevorzugten LCID-Sprachcode des Benutzers abrufen können.
Sie können die bevorzugte Sprache des Benutzers aus der UserSettings.UILanguageId-Spalte abrufen.
static int? RetrieveUserUILanguageCode(IOrganizationService service)
{
// To get the current user's systemuserid
var whoIAm = (WhoAmIResponse)service.Execute(new WhoAmIRequest());
var query = new QueryExpression("usersettings")
{
ColumnSet = new ColumnSet("uilanguageid", "systemuserid"),
Criteria = new FilterExpression
{
Conditions = {
{
new ConditionExpression(
attributeName:"systemuserid",
conditionOperator:ConditionOperator.Equal,
value: whoIAm.UserId)
}
}
},
TopCount = 1
};
EntityCollection userSettings = service.RetrieveMultiple(query: query);
if (userSettings.Entities.Count > 0)
{
return (int)userSettings.Entities[0]["uilanguageid"];
}
return null;
}
Siehe auch
Cache-Schemadaten
Beispiel für das Abfragen von Schemadefinitionen der Web-API und das Erkennen von Änderungen (C#)
Beispiel für das Abfragen von Schemadefinitionen des SDK für .NET und das Erkennen von Änderungen (C#)
SDK für .NET: Tabellendefinitionen in Microsoft Dataverse
Abfragen von Tabellendefinitionen mithilfe der Web-API
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).