Compartir a través de


Usar LINQ para crear una consulta

El proveedor de consulta Consulta integrada del lenguaje .NET (LINQ) en Microsoft Dataverse usa sintaxis LINQ estándar. El primer paso en la creación de una consulta de LINQ es identificar los tipos de tabla relevantes y las relaciones entre ellos. A continuación puede especificar el origen de datos y los demás parámetros de consulta.

La cláusula from se usa para devolver una tabla "raíz" única. El proveedor de consulta solo puede devolver filas de un único tipo de tabla. Las cláusulas orderby y select deben hacer referencia a esta tabla raíz. Puede usar cláusulas join para agregar filas a una relación con la tabla "raíz".

Operadores LINQ

Todas expresiones de consulta LINQ tienen un formato similar. Las siguientes secciones muestran las cláusulas más comunes en una expresión de consulta LINQ al usar el proveedor de consulta LINQ de Dataverse.

de

Cuando se usa el contexto de servicio generado y el enlace en tiempo de compilación, use el conjunto de tablas IQueryable, como AccountSet, en el contexto generado.

Cuando se use el contexto generado, el método CreateQuery del objeto del contexto del servicio le da acceso a las filas de tabla de Dataverse.

Ejemplo:

Mediante el contexto de servicio generado:

var query1 = from c in context.ContactSet  
select c;  

Usando el método CreateQuery:

var query1 = from c in context.CreateQuery<Contact>()  
select c;  

join

La cláusula join representa una combinación interna. La cláusula se usa para trabajar con dos o varias tablas que se pueden combinar con un valor de columna común.

Ejemplo:

from c in context.ContactSet  
join a in context.AccountSet on c.ContactId equals a.PrimaryContactId.Id  

donde

La cláusula where aplica un filtro a los resultados, ofreciendo a menudo una expresión booleana. El filtro especifica qué elementos se excluirán de la secuencia de origen. Cada cláusula where solo puede contener condiciones frente a un tipo de tabla único. Una condición compuesta que abarca varias tablas no es válida. En su lugar, cada tabla debe filtrarse en cláusulas where independientes.

Ejemplo:

from a in context.AccountSet  
where (a.Name.StartsWith("Contoso") && a.Address1_StateOrProvince == "WA")  

orderby

El operador orderby coloca las columnas de consulta devueltas en un orden especificado.

Ejemplo:

var query1 = from c in context.CreateQuery<Contact>()     
    orderby c.FullName ascending     
    select c;  
foreach ( var q in query1)     
{  
    Console.WriteLine(q.FirstName + " " + q.LastName);     
}  

seleccionar

La cláusula select define el formulario de los datos devueltos. La cláusula crea un conjunto de columnas basándose en los resultados de la expresión de consulta. También puede definir una instancia de un nuevo objeto con el que trabajar. El objeto recién creado mediante la cláusula select no se crea en el servidor, sino que es una instancia local.

Ejemplo:

select new Contact     
{  
    ContactId = c.ContactId,  
    FirstName = c.FirstName,  
    LastName = c.LastName,  
    Address1_Telephone1 = c.Address1_Telephone1     
};  

Limitaciones de LINQ

El proveedor de la consulta LINQ admite un subconjunto de los operadores LINQ. No se admiten todas las condiciones que se pueden expresar en LINQ. La siguiente tabla muestra algunas de las limitaciones de los operadores LINQ básicos.

Operador LINQ Limitaciones
join Representa una combinación interna o externa. Solo se admiten las uniones externas izquierdas.
from Admite una cláusula from por consulta.
where El lado izquierdo de la cláusula debe ser un nombre de columna y el lado derecho de la cláusula debe ser un valor. No puede establecer el lado izquierdo de una constante. Ambos lados de la cláusula no pueden ser constantes.

Admite las funciones String Contains, StartsWith, EndsWith y Equals.
groupBy No compatible. FetchXML admite opciones de agrupación que no están disponibles con el proveedor de consultas LINQ. Más información: Agregar datos mediante FetchXmlAgregar datos mediante FetchXml
orderBy Admite la ordenación por columnas de tabla, como Contact.FullName.
select Admite inicializadores, constructores y tipos anónimos.
last El operador last no es compatible.
skip y take Admite skip y take mediante la paginación del lado servidor. El valor skip debe ser superior o igual al valor take.
aggregate No compatible. FetchXML admite opciones de agregación que no están disponibles con el proveedor de consultas LINQ. Más información: Agregar datos mediante FetchXML.

Filtrar varias tablas

Puede crear consultas complejas Consulta integrada del lenguaje .NET (LINQ) en Dataverse. Se usan varias cláusulas múltiples de Join con cláusulas de filtro para crear un resultado que se filtra por columnas de varias tablas.

El siguiente ejemplo muestra cómo crear una consulta LINQ que funciona con dos tablas y que filtra el resultado según los valores de cada una de las filas de tabla.

using (ServiceContext svcContext = new ServiceContext(_serviceProxy))
{
var query_where3 = from c in svcContext.ContactSet
 join a in svcContext.AccountSet
 on c.ContactId equals a.PrimaryContactId.Id
 where a.Name.Contains("Contoso")
 where c.LastName.Contains("Smith")
 select new
 {
  account_name = a.Name,
  contact_name = c.LastName
 };

foreach (var c in query_where3)
{
 System.Console.WriteLine("acct: " +
  c.account_name +
  "\t\t\t" +
  "contact: " +
  c.contact_name);
}
}

Consulte también

Crear consultas con LINQ (consulta integrada del lenguaje .NET)
Usar clase de entidad de enlace en tiempo de ejecución con una consulta LINQ
Ordene los resultados usando columnas de tabla con LINQ
Paginar grandes conjuntos de resultados con LINQ
Ejemplo: Consultar datos con LINQ
Ejemplos de la consulta LINQ mediante OrganizationServiceContext con Microsoft Dataverse

Nota

¿Puede indicarnos sus preferencias de idioma de documentación? Realice una breve encuesta. (tenga en cuenta que esta encuesta está en inglés)

La encuesta durará unos siete minutos. No se recopilan datos personales (declaración de privacidad).