Partager via


Recherches multi-tables

En utilisant des colonnes de type de recherche multi-table, parfois appelées recherches polymorphes, vous pouvez utiliser une table spécifique qui a plusieurs relations un-à-plusieurs (1 :N) avec d’autres tables de l’environnement. Une colonne de type de recherche unique peut faire référence à plusieurs autres tables. Une valeur de recherche envoyée à la colonne de type multi-table correspond à un enregistrement dans l’une des tables associées. Vous pouvez créer des recherches à plusieurs tables avec des tables locales et des tables virtuelles en tant que tables référencées.

Microsoft Dataverse inclut actuellement des types de tables multiples comme des types statiques, tels que Customer, qui se connecte aux tables Account et Contact. En utilisant des recherches multi-tables, vous pouvez définir toutes les autres recherches multi-tables dont vous avez besoin.

Note

Vous pouvez créer et modifier des recherches multi-tables personnalisées via le Kit de développement logiciel (SDK) pour .NET ou l’API Web Dataverse. La prise en charge de l’interface utilisateur interactive sera disponible dans une prochaine version.

Exemple : Exemple de recherche multi-tables de l’API web (PowerShell) contient l’exemple de code qui illustre l’exemple présenté dans cet article.

Pour récupérer des informations sur les tables associées avec une colonne de recherche, y compris les recherches à plusieurs tables, utilisez l’une des méthodes suivantes : récupérez la propriété de recherche ou développez la propriété de navigation à valeur unique.

Récupérer la propriété de recherche

Chaque colonne de recherche a une propriété de recherche correspondante que vous pouvez récupérer à l’aide de l’option $select de requête. Ces propriétés suivent la convention d’affectation de noms : _<name>_value. <name> est le nom logique de la colonne de recherche. La valeur de la propriété de recherche est l’identificateur unique de l’enregistrement associé, le cas échéant.

Pour une recherche à plusieurs tables, l’ID unique n’est pas utile, sauf si vous savez la table à laquelle elle s’applique. Lorsque vous récupérez des données à partir d’une colonne de recherche, vous pouvez appliquer les préférences d’annotation OData suivantes. Ces options de préférence sont particulièrement utiles avec une recherche multi-table, car elles fournissent plus de données à partir de l’enregistrement associé et des informations sur la table à partir de laquelle les données proviennent.

Annotation Description
OData.Community.Display.V1.FormattedValue Retourne la valeur de la colonne principale de nom pour l’enregistrement actuellement sélectionné dans cette colonne.
Microsoft.Dynamics.CRM.associatednavigationproperty Retourne le nom de la propriété de navigation à valeur unique qui prend en charge l’enregistrement actuellement défini dans cette colonne.
Microsoft.Dynamics.CRM.lookuplogicalname Retourne le nom logique de la table pour l’enregistrement actuellement défini dans cette colonne.

Note

Utilisez les propriétés de recherche pour récupérer la valeur mise en forme et les métadonnées nécessaires afin d'étendre la propriété de navigation à valeur unique pour obtenir plus d’informations.

En savoir plus sur la récupération des données de propriété de recherche.

Développer la propriété de navigation à valeur unique

Lorsque vous créez une recherche multi-tables, chaque table nécessite une relation un-à-plusieurs distincte. Chaque relation ajoute une propriété de navigation à valeur unique distincte.

Le nom de cette propriété de navigation à valeur unique est stocké dans la propriété OneToManyRelationshipMetadata.ReferenceingEntityNavigationPropertyName . Une erreur courante est que les gens essaient de deviner la valeur de cette propriété sensible à la casse. Il existe trois façons de déterminer définitivement le nom correct de cette propriété de navigation :

Lorsque vous interrogez la table, utilisez l’option $expand de requête avec la propriété de navigation à valeur unique pour inclure la table associée. En savoir plus sur la jonction de tables associées à l’aide de l’option de requête OData$expand.

Exemple

Supposons que vous hébergez des médias pour les utilisateurs d’une bibliothèque. Vous avez de nombreux objets multimédias différents. Beaucoup d’entre eux ont le même nom, mais sont dans différents formats tels que les livres, l’audio et la vidéo.

Dans cet exemple, trois tables prennent en charge chaque type de média spécifique :

  • sample_Book inclut sample_name et sample_callnumber colonnes.
  • sample_Audio inclut sample_name et sample_audioformat colonnes.
  • sample_Video inclut sample_name et sample_videoformat colonnes.

La table sample_Media a une recherche multi-tables avec le nom du schéma sample_MediaPolymorphicLookup. Vous pouvez définir la colonne de recherche pour faire référence aux enregistrements dans l’une des trois tables multimédias spécifiques.

Table sample_Book

La sample_Book table est la première des trois tables associées. Cette requête simple récupère les deux enregistrements trouvés dans cette table.

GET [Organization URI]/api/data/v9.2/sample_books?$select=sample_name,sample_callnumber
Content-Type: application/json; charset=utf-8
OData-MaxVersion: 4.0
OData-Version: 4.0
Accept: application/json

Cet exemple montre le corps JSON de la réponse :

{
   "@odata.context": "[Organization URI]/api/data/v9.2/$metadata#sample_books(sample_name,sample_callnumber)",
   "value": [
      {
         "@odata.etag": "W/\"171704230\"",
         "sample_callnumber": "ww-3452 ",
         "sample_bookid": "00000000-0000-0000-0000-000000000001",
         "sample_name": "Content1"
      },
      {
         "@odata.etag": "W/\"171704235\"",
         "sample_callnumber": "a4e-87hw",
         "sample_bookid": "00000000-0000-0000-0000-000000000005",
         "sample_name": "Content2"
      }
   ]
}

Table sample_Audio

La sample_Audio table est la deuxième des trois tables associées. Cette requête simple récupère les deux enregistrements de cette table.

GET [Organization URI]/api/data/v9.2/sample_audios?$select=sample_name,sample_audioformat
Content-Type: application/json; charset=utf-8
OData-MaxVersion: 4.0
OData-Version: 4.0
Accept: application/json

Cet exemple montre le corps JSON de la réponse :

{
   "@odata.context": "[Organization URI]/api/data/v9.2/$metadata#sample_audios(sample_name,sample_audioformat)",
   "value": [
      {
         "@odata.etag": "W/\"171704242\"",
         "sample_audioid": "00000000-0000-0000-0000-000000000002",
         "sample_audioformat": "mp4",
         "sample_name": "Content1"
      },
      {
         "@odata.etag": "W/\"171704246\"",
         "sample_audioid": "00000000-0000-0000-0000-000000000004",
         "sample_audioformat": "wma",
         "sample_name": "Content3"
      }
   ]
}

Table sample_Video

La sample_Video table est la troisième des trois tables associées. Cette requête simple récupère les deux enregistrements de cette table.

GET [Organization URI]/api/data/v9.2/sample_videos?$select=sample_name,sample_videoformat
Content-Type: application/json; charset=utf-8
OData-MaxVersion: 4.0
OData-Version: 4.0
Accept: application/json

Cet exemple montre le corps JSON de la réponse :

{
   "@odata.context": "[Organization URI]/api/data/v9.2/$metadata#sample_videos(sample_name,sample_videoformat)",
   "value": [
      {
         "@odata.etag": "W/\"171704254\"",
         "sample_name": "Content2",
         "sample_videoformat": "avi",
         "sample_videoid": "00000000-0000-0000-0000-000000000006"
      },
      {
         "@odata.etag": "W/\"171704250\"",
         "sample_name": "Content3",
         "sample_videoformat": "wmv",
         "sample_videoid": "00000000-0000-0000-0000-000000000003"
      }
   ]
}

Table sample_Media

Cette table comporte la colonne de recherche multi-tables avec le nom de schéma sample_MediaPolymorphicLookup et le nom logique sample_mediapolymorphiclookup.

Dans le cadre de cette démonstration, ce tableau contient seulement quatre enregistrements liés aux enregistrements de soutien :

sample_name valeur sample_mediapolymorphiclookup Type sample_mediapolymorphiclookup
Media Object One 00000000-0000-0000-0000-000000000001 sample_book
Média objet Deux 00000000-0000-0000-0000-000000000002 sample_audio
Objet multimédia Trois 00000000-0000-0000-0000-000000000003 sample_video
Media, objet Quatre 00000000-0000-0000-0000-000000000004 sample_audio

À l’aide de la table sample_Media, cet exemple de requête :

  • Sélectionne la propriété _sample_mediapolymorphiclookup_value de recherche dans l’option de requête $select pour la colonne sample_mediapolymorphiclookup de recherche. En utilisant les préférences OData.Community.Display.V1.FormattedValue, Microsoft.Dynamics.CRM.associatednavigationproperty et Microsoft.Dynamics.CRM.lookuplogicalnameodata.include-annotations, vous obtenez ces valeurs avec chaque enregistrement.
  • Développe trois propriétés de navigation à valeur unique, une pour chaque table associée. Pour chaque propriété de navigation développée, la colonne de nom principal (sample_name) est sélectionnée ainsi que la valeur de colonne personnalisée respective : sample_callnumber, sample_audioformat, sample_videoformat.

Note

Une seule des trois navigations à valeur unique développée peut avoir des données. Les trois seront null si la colonne de recherche n’est pas définie.

Ces opérations montrent comment les enregistrements de table sont liés par le biais de la sample_MediaPolymorphicLookup colonne de recherche.

Requête

GET [Organization URI]
/api/data/v9.2/sample_medias
?$select=sample_name,_sample_mediapolymorphiclookup_value
&$expand=sample_MediaPolymorphicLookup_sample_book(
    $select=sample_name,sample_callnumber),
sample_MediaPolymorphicLookup_sample_audio(
    $select=sample_name,sample_audioformat),
sample_MediaPolymorphicLookup_sample_video(
    $select=sample_name,sample_videoformat)
Content-Type: application/json; charset=utf-8
OData-MaxVersion: 4.0
OData-Version: 4.0
Accept: application/json
Prefer: odata.include-annotations="OData.Community.Display.V1.FormattedValue,Microsoft.Dynamics.CRM.associatednavigationproperty,Microsoft.Dynamics.CRM.lookuplogicalname"

Note

Pour une lisibilité, l’URL s’affiche sur plusieurs lignes. Lorsque vous effectuez la requête, supprimez tous les sauts de ligne et tous les espaces blancs afin que l’URL soit une chaîne continue unique.

Réponse

Lorsque vous définissez ces options de requête et les en-têtes de préférence, le corps de la réponse contient le code JSON suivant :

{
   "@odata.context": "[Organization URI]/api/data/v9.2/$metadata#sample_medias(sample_name,_sample_mediapolymorphiclookup_value,sample_MediaPolymorphicLookup_sample_book(sample_name),sample_MediaPolymorphicLookup_sample_audio(sample_name,sample_audioformat),sample_MediaPolymorphicLookup_sample_video(sample_name))",
   "value": [
      {
         "@odata.etag": "W/\"171704264\"",
         "sample_mediaid": "00000000-0000-0000-0000-000000000007",
         "sample_name": "Media Object One",
         "_sample_mediapolymorphiclookup_value@OData.Community.Display.V1.FormattedValue": "Content1",
         "_sample_mediapolymorphiclookup_value@Microsoft.Dynamics.CRM.associatednavigationproperty": "sample_MediaPolymorphicLookup_sample_book",
         "_sample_mediapolymorphiclookup_value@Microsoft.Dynamics.CRM.lookuplogicalname": "sample_book",
         "_sample_mediapolymorphiclookup_value": "00000000-0000-0000-0000-000000000001",
         "sample_MediaPolymorphicLookup_sample_book": {
            "sample_bookid": "00000000-0000-0000-0000-000000000001",
            "sample_name": "Content1",
            "sample_callnumber": "ww-3452"
         },
         "sample_MediaPolymorphicLookup_sample_audio": null,
         "sample_MediaPolymorphicLookup_sample_video": null
      },
      {
         "@odata.etag": "W/\"171704268\"",
         "sample_mediaid": "00000000-0000-0000-0000-000000000008",
         "sample_name": "Media Object Two",
         "_sample_mediapolymorphiclookup_value@OData.Community.Display.V1.FormattedValue": "Content1",
         "_sample_mediapolymorphiclookup_value@Microsoft.Dynamics.CRM.associatednavigationproperty": "sample_MediaPolymorphicLookup_sample_audio",
         "_sample_mediapolymorphiclookup_value@Microsoft.Dynamics.CRM.lookuplogicalname": "sample_audio",
         "_sample_mediapolymorphiclookup_value": "00000000-0000-0000-0000-000000000002",
         "sample_MediaPolymorphicLookup_sample_book": null,
         "sample_MediaPolymorphicLookup_sample_audio": {
            "sample_audioid": "00000000-0000-0000-0000-000000000002",
            "sample_name": "Content1",
            "sample_audioformat": "mp4"
         },
         "sample_MediaPolymorphicLookup_sample_video": null
      },
      {
         "@odata.etag": "W/\"171704273\"",
         "sample_mediaid": "00000000-0000-0000-0000-000000000009",
         "sample_name": "Media Object Three",
         "_sample_mediapolymorphiclookup_value@OData.Community.Display.V1.FormattedValue": "Content3",
         "_sample_mediapolymorphiclookup_value@Microsoft.Dynamics.CRM.associatednavigationproperty": "sample_MediaPolymorphicLookup_sample_video",
         "_sample_mediapolymorphiclookup_value@Microsoft.Dynamics.CRM.lookuplogicalname": "sample_video",
         "_sample_mediapolymorphiclookup_value": "00000000-0000-0000-0000-000000000003",
         "sample_MediaPolymorphicLookup_sample_book": null,
         "sample_MediaPolymorphicLookup_sample_audio": null,
         "sample_MediaPolymorphicLookup_sample_video": {            
            "sample_videoid": "00000000-0000-0000-0000-000000000003",
            "sample_name": "Content3",
            "sample_videoformat": "wmv"
         }
      },
      {
         "@odata.etag": "W/\"171704279\"",
         "sample_mediaid": "00000000-0000-0000-0000-000000000010",
         "sample_name": "Media Object Four",
         "_sample_mediapolymorphiclookup_value@OData.Community.Display.V1.FormattedValue": "Content3",
         "_sample_mediapolymorphiclookup_value@Microsoft.Dynamics.CRM.associatednavigationproperty": "sample_MediaPolymorphicLookup_sample_audio",
         "_sample_mediapolymorphiclookup_value@Microsoft.Dynamics.CRM.lookuplogicalname": "sample_audio",
         "_sample_mediapolymorphiclookup_value": "00000000-0000-0000-0000-000000000004",
         "sample_MediaPolymorphicLookup_sample_book": null,
         "sample_MediaPolymorphicLookup_sample_audio": {
            "sample_audioid": "00000000-0000-0000-0000-000000000004",
            "sample_name": "Content3",
            "sample_audioformat": "wma"
         },
         "sample_MediaPolymorphicLookup_sample_video": null
      }
   ]
}

Définition d’une colonne de recherche à plusieurs tables

La mise à jour d’un enregistrement pour définir une colonne de recherche polymorphe est exactement comme décrit dans Associer à une propriété de navigation à valeur unique. Utilisez le bon nom de la propriété de navigation à valeur unique. Ces noms sont sensibles à la casse.

Cet exemple montre comment mettre à jour une valeur à l’aide PATCHde .

Requête

PATCH [Organization Uri]/api/data/v9.2/sample_medias(00000000-0000-0000-0000-000000000007) HTTP/1.1
If-Match: *
OData-MaxVersion: 4.0
OData-Version: 4.0
If-None-Match: null
Accept: application/json

{
  "sample_MediaPolymorphicLookup_sample_book@odata.bind": "sample_books(00000000-0000-0000-0000-000000000001)"
}

Réponse

HTTP/1.1 204 NoContent
OData-Version: 4.0

Créer une colonne de recherche à plusieurs tables

Note

L’exemple suivant montre comment utiliser l’API Web Dataverse. Vous pouvez également utiliser le SDK pour .NET avec les classes CreatePolymorphicLookupAttributeRequest et CreatePolymorphicLookupAttributeResponse.

Utilisez l’action CreatePolymorphicLookupAttribute pour créer une recherche à plusieurs tables. Cet exemple crée la colonne dans le cadre d’une solution portant le nom polymorphiclookupexamplesolution unique à l’aide du SolutionUniqueName paramètre.

Requête

POST [Organization URI]/api/data/v9.2/CreatePolymorphicLookupAttribute HTTP/1.1
Consistency: Strong
Accept: application/json
OData-MaxVersion: 4.0
Authorization: Bearer [REDACTED]
OData-Version: 4.0

{
  "OneToManyRelationships": [
    {
      "ReferencedEntity": "sample_book",
      "SchemaName": "sample_media_sample_book",
      "ReferencingEntity": "sample_media"
    },
    {
      "ReferencedEntity": "sample_audio",
      "SchemaName": "sample_media_sample_audio",
      "ReferencingEntity": "sample_media",
      "CascadeConfiguration": {
        "Assign": "NoCascade",
        "Share": "NoCascade",
        "Delete": "RemoveLink",
        "Merge": "NoCascade",
        "Reparent": "NoCascade",
        "Unshare": "NoCascade"
      }
    },
    {
      "ReferencedEntity": "sample_video",
      "SchemaName": "sample_media_sample_video",
      "ReferencingEntity": "sample_media",
      "CascadeConfiguration": {
        "Assign": "NoCascade",
        "Share": "NoCascade",
        "Delete": "RemoveLink",
        "Merge": "NoCascade",
        "Reparent": "NoCascade",
        "Unshare": "NoCascade"
      }
    }
  ],
  "Lookup": {
    "AttributeTypeName": {
      "Value": "LookupType"
    },
    "SchemaName": "sample_MediaPolymorphicLookup",
    "Description": {
      "LocalizedLabels": [
        {
          "@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
          "Label": "Polymorphic lookup that can reference a Book, Audio, or Video record",
          "LanguageCode": 1033
        }
      ],
      "@odata.type": "Microsoft.Dynamics.CRM.Label"
    },
    "AttributeType": "Lookup",
    "DisplayName": {
      "LocalizedLabels": [
        {
          "@odata.type": "Microsoft.Dynamics.CRM.LocalizedLabel",
          "Label": "Media",
          "LanguageCode": 1033
        }
      ],
      "@odata.type": "Microsoft.Dynamics.CRM.Label"
    },
    "@odata.type": "Microsoft.Dynamics.CRM.ComplexLookupAttributeMetadata"
  },
 "SolutionUniqueName": "polymorphiclookupexamplesolution"
}

La réponse suivante contient un exemple de CreatePolymorphicLookupAttributeResponse ComplexType. Il contient l’ID de l’attribut polymorphe et toutes les relations créées.

Réponse

HTTP/1.1 200 OK
Content-Type: application/json; odata.metadata=minimal
OData-Version: 4.0

{
    "@odata.context":
      "http://<organization URL>/api/data/v9.2/$metadata#Microsoft.Dynamics.CRM.CreatePolymorphicLookupAttributeResponse",

    "RelationshipIds":[
        "77d4c6e9-0397-eb11-a81c-000d3a6cfaba",
        "7ed4c6e9-0397-eb11-a81c-000d3a6cfaba",
        "85d4c6e9-0397-eb11-a81c-000d3a6cfaba"
    ],

    "AttributeId":"d378dd3e-42f4-4bd7-95c7-0ee546c7de40"
}

Ajouter une relation à une colonne de recherche multitable existante

L’ajout d’une relation à une colonne de recherche multi-tables existante à l’aide de l’API Web est similaire à la création d’une nouvelle relation un-à-plusieurs. Découvrez comment créer une relation un-à-plusieurs à l’aide de l’API web. La différence est que la propriété OneToManyRelationshipMetadata.Lookup doit avoir une SchemaName valeur qui correspond à la colonne de recherche polymorphe existante.

Supprimer une relation d’une colonne de recherche multi-table existante

La suppression d’une relation d’une colonne de recherche multi-tables existante via l’API web est équivalente à la suppression de n’importe quelle relation un-à-plusieurs. Envoyez une DELETE requête au RelationshipDefinitions point de terminaison à l’aide de la valeur de la propriété OneToManyRelationshipMetadata.MetadataId en tant que clé.

Voir aussi

Exemple : Exemple de recherche multi-tables de l’API web (PowerShell)
Utiliser l’API Web avec les définitions de table
Créer et mettre à jour des relations de table
Requête des définitions de table à l’aide de l’API web
Récupérer les définitions de table par nom ou MetadataId
Modèles de tables et de colonnes à l’aide de l’API Web
Exemple d’opérations de schéma de table de l’API web
Exemple d’opérations de schéma de table de l’API web (C#)