Compartir a través de


Búsquedas en varias tablas

Mediante el uso de columnas de búsqueda de múltiples tablas, a veces denominadas búsquedas polimórficas, es posible emplear una tabla específica que tiene varias relaciones de uno a varios (1:N) con otras tablas del entorno. Una sola columna de tipo de búsqueda puede hacer referencia a otras tablas. Un valor de búsqueda enviado a la columna de tipo de varias tablas coincide con un registro en cualquiera de las tablas relacionadas. Puede crear búsquedas de varias tablas con tablas locales y tablas virtuales como tablas a las que se hace referencia.

Microsoft Dataverse actualmente incluye tipos de tablas múltiples como tipos estáticos, como Cliente, que se conecta a las tablas Account y Contact. Mediante búsquedas de varias tablas, puede definir cualquier otra búsqueda de varias tablas que necesite.

Nota

Puede crear y modificar búsquedas personalizadas de varias tablas a través del SDK para .NET o Dataverse Web API. La compatibilidad con la interfaz de usuario interactiva estará disponible en una versión futura.

Ejemplo: El ejemplo de búsqueda de varias tablas de Web API (PowerShell) contiene el código de ejemplo que muestra el ejemplo presentado en este artículo.

Para recuperar información sobre las tablas relacionadas con una columna de búsqueda, incluidas las búsquedas de varias tablas, use uno de los métodos siguientes: recuperar la propiedad de búsqueda o expandir la propiedad de navegación con un solo valor.

Recuperar la propiedad de consulta

Cada columna de búsqueda tiene una propiedad de búsqueda correspondiente que puede recuperar mediante la opción de consulta. Estas propiedades siguen la convención de nomenclatura: . es el nombre lógico de la columna de búsqueda. El valor de la propiedad de búsqueda es el identificador único del registro relacionado, si existe.

Para una búsqueda de varias tablas, el identificador único no es útil a menos que sepa a qué tabla se aplica. Al recuperar datos de cualquier columna de búsqueda, puede aplicar las siguientes preferencias de anotación de OData. Estas opciones de preferencia son especialmente útiles con una búsqueda de varias tablas porque proporcionan más datos del registro relacionado e información sobre la tabla de la que proceden los datos.

Anotación Descripción
OData.Community.Display.V1.FormattedValue Devuelve el valor de columna de nombre principal del registro establecido actualmente en esta columna.
Microsoft.Dynamics.CRM.associatednavigationproperty Devuelve el nombre de la propiedad de navegación de un solo valor que admite el registro actualmente establecido en esta columna.
Microsoft.Dynamics.CRM.lookuplogicalname Devuelve el nombre lógico de la tabla para el registro establecido actualmente en esta columna.

Nota

Usa las propiedades de búsqueda para recuperar el valor formateado y los metadatos auxiliares necesarios para expandir la propiedad de navegación de un solo valor y así obtener más información.

Obtenga más información sobre cómo recuperar datos de propiedades de búsqueda.

Expandir la propiedad de navegación de valor único

Al crear una búsqueda de varias tablas, se requiere que cada tabla tenga una relación independiente de uno a varios. Cada relación agrega una propiedad de navegación distinta y de valor único.

El nombre de esta propiedad de navegación con un solo valor se almacena en la propiedad OneToManyRelationshipMetadata.ReferencingEntityNavigationPropertyName . Un error común es cuando las personas intentan adivinar el valor de esta propiedad que distingue mayúsculas de minúsculas. Hay tres maneras de determinar definitivamente el nombre correcto de esta propiedad de navegación:

  • Recupere los metadatos de la relación. Obtenga más información sobre las opciones para recuperar definiciones de esquema de Dataverse.
  • Descargue y revise el documento de $metadata CSDL. Obtenga información sobre cómo identificar estas propiedades de navegación de un solo valor en el documento de servicio $metadata.
  • Retrieve la propiedad de búsqueda e incluya las preferencias de anotación de Microsoft.Dynamics.CRM.associatednavigationproperty OData.

Al consultar la tabla, use la opción de consulta con la propiedad de navegación de un solo valor para incluir la tabla relacionada. Obtenga más información sobre cómo combinar tablas relacionadas mediante la opción de consulta OData.

Ejemplo

Supongamos que hospeda medios para los usuarios de una biblioteca. Tiene muchos objetos multimedia diferentes. Muchos de ellos tienen el mismo nombre, pero están en diferentes formatos, como libros, audio y vídeo.

En este ejemplo, tres tablas admiten cada tipo específico de medio:

  • incluye y columnas.
  • incluye y columnas.
  • incluye y columnas.

La tabla tiene una búsqueda en varias tablas con el nombre del esquema. Puede establecer la columna de búsqueda para hacer referencia a registros en cualquiera de las tres tablas multimedia específicas.

Tabla

La tabla es la primera de las tres tablas relacionadas. Esta consulta simple recupera los dos registros que se encuentran en esta tabla.

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

En este ejemplo se muestra el cuerpo JSON de la respuesta:

{
   "@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"
      }
   ]
}

Tabla

La tabla es la segunda de las tres tablas relacionadas. Esta consulta simple recupera los dos registros de esta tabla.

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

En este ejemplo se muestra el cuerpo JSON de la respuesta:

{
   "@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"
      }
   ]
}

Tabla

La tabla es la tercera de las tres tablas relacionadas. Esta consulta simple recupera los dos registros de esta tabla.

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

En este ejemplo se muestra el cuerpo JSON de la respuesta:

{
   "@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"
      }
   ]
}

Tabla

Esta tabla tiene una columna de búsqueda de varias tablas con el nombre de esquema y el nombre lógico.

Para esta demostración, esta tabla contiene solo cuatro registros relacionados con los registros auxiliares:

sample_name valor tipo
Objeto multimedia uno 00000000-0000-0000-0000-000000000001 sample_book
Elemento multimedia dos 00000000-0000-0000-0000-000000000002 sample_audio
Recurso multimedia 3 00000000-0000-0000-0000-000000000003 sample_video
Elemento Multimedia Cuatro 00000000-0000-0000-0000-000000000004 sample_audio

Usando la tabla, la siguiente consulta de ejemplo:

  • Selecciona la propiedad de búsqueda en la opción de consulta para la columna buscada. Con las preferencias de OData.Community.Display.V1.FormattedValue, Microsoft.Dynamics.CRM.associatednavigationproperty y Microsoft.Dynamics.CRM.lookuplogicalnameodata.include-annotations, obtiene estos valores con cada registro.
  • Expande tres propiedades de navegación con valores únicos, una para cada tabla relacionada. Para cada propiedad de navegación expandida, se selecciona la columna de nombre principal () así como el valor de columna personalizada correspondiente: , , .

Nota

Solo una de las tres navegaciones expandidas univaluadas podría tener datos. Las tres serán nulas si no se establece la columna de búsqueda.

Estas operaciones muestran cómo se relacionan los registros de tabla a través de la columna de búsqueda.

Solicitud

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"

Nota

Para mejorar la legibilidad, la dirección URL se muestra entre varias líneas. Al realizar la solicitud, quite todos los saltos de línea y el espacio en blanco para que la dirección URL sea una sola cadena continua.

Respuesta

Al establecer estas opciones de consulta y encabezados de preferencias, el cuerpo de la respuesta contiene el siguiente JSON:

{
   "@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
      }
   ]
}

Establecimiento de una columna de búsqueda de varias tablas

Actualizar un registro para configurar una columna de búsqueda polimórfica es tal y como se describe en Asociar con una propiedad de navegación de valor único. Utiliza el nombre correcto de la propiedad de navegación de valor único. Estos nombres son sensibles a mayúsculas y minúsculas.

En este ejemplo se muestra cómo actualizar un valor mediante .

Solicitud

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)"
}

Respuesta

HTTP/1.1 204 NoContent
OData-Version: 4.0

Creación de una columna de búsqueda de varias tablas

Nota

En el ejemplo siguiente se muestra cómo usar la API web de Dataverse. También puede usar el SDK para .NET con las clases /CreatePolymorphicLookupAttributeRequest y CreatePolymorphicLookupAttributeResponse.

Use la acción CreatePolymorphicLookupAttribute para crear una búsqueda de varias tablas. En este ejemplo se crea la columna como parte de una solución con un nombre único mediante el parámetro opcional MSCRM.SolutionUniqueName.

Solicitud

POST [Organization URI]/api/data/v9.2/CreatePolymorphicLookupAttribute HTTP/1.1
Consistency: Strong
Accept: application/json
OData-MaxVersion: 4.0
Authorization: Bearer [REDACTED]
MSCRM.SolutionUniqueName: polymorphiclookupexamplesolution
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"
  }
}

El siguiente JSON es un ejemplo del ComplexType CreatePolymorphicLookupAttributeResponse. Contiene el identificador del atributo polimórfico y todas las relaciones creadas.

{
    "@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"
}

Agregar relación a la columna de búsqueda de múltiples tablas existente

Agregar una relación a una columna de búsqueda de varias tablas existente mediante la API web es similar a crear cualquier nueva relación uno a varios. Aprenda a crear una relación de uno a varios mediante la API web. La diferencia es que la propiedad OneToManyRelationshipMetadata debe tener un valor que coincida con la columna de búsqueda polimórfica existente.

Eliminar una relación de una columna de búsqueda de varias tablas existente

Quitar una relación de una columna de búsqueda de varias tablas existente mediante la API web es igual que eliminar cualquier relación de uno a muchos. Envíe una solicitud al punto de conexión mediante el valor de la propiedad OneToManyRelationshipMetadata como clave.

Consulte también

Ejemplo: Ejemplo de búsqueda de varias tablas de Web API (PowerShell)
Uso de la API web con definiciones de tabla
Crear y actualizar relaciones de tablas
Consultar definiciones de tabla con la API web
Recuperar definiciones de tabla por nombre o MetadataId
Modelar tablas y columnas mediante la API web
Ejemplo de operaciones de esquema de tabla de API web
Ejemplo de operaciones de esquema de tabla de API web (C#)