Compartir por


Usar LINQ para crear una consulta

 

Publicado: noviembre de 2016

Se aplica a: Dynamics CRM 2015

El proveedor de consulta de Consulta integrada del lenguaje .NET (LINQ) en Microsoft Dynamics CRM 2015 y actualización de Microsoft Dynamics CRM Online 2015 usa sintaxis de LINQ estándar. El primer paso en la creación de una consulta de LINQ es identificar los tipos de entidad 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 entidad "raíz" única. El proveedor de consulta solo puede devolver entidades de un único tipo de entidad. Las cláusulas orderby y select deben hacer referencia a esta entidad raíz. Puede usar cláusulas join para agregar entidades a una relación con la entidad "raíz".

En este tema

Operadores LINQ

Limitaciones de LINQ

Filtrar varias entidades

Operadores LINQ

Todas expresiones de consulta LINQ tienen un formato similar. La siguiente tabla muestra las cláusulas más comunes en una expresión de consulta LINQ al usar el proveedor de consulta LINQ de Microsoft Dynamics 365.

Operador LINQ

Descripción

Ejemplo

Obtenga un origen de datos (la cláusula from)

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

Cuando se use el contexto generado, el método CreateQuery del objeto del contexto del servicio de la organización le da acceso a las entidades Microsoft Dynamics 365.

Mediante el contexto de servicio generado:

var query1 = from c in context.ContactSetselect c;

Usando el método CreateQuery:

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

Cláusula join

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

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

Filtrado (la cláusula where)

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 entidad único. Una condición compuesta que abarca varias entidades no es válida. En su lugar, cada entidad debe filtrarse en cláusulas where independientes.

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

orderby

El operador orderby coloca los atributos de consulta devueltos en un orden especificado.

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

Cláusula select

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.

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. No se pueden realizar combinaciones externas.

from

Admite una cláusula from por consulta.

where

El lado izquierdo de la cláusula debe ser un nombre de atributo 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 StringContains, StartsWith, EndsWith y Equals.

groupBy

Incompatible. FetchXML admite las opciones de agrupación que no están disponibles con el proveedor de consultas LINQ.Más información:Usar el agregado FetchXML

orderBy

Admite la ordenación por atributos de entidad, 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

Incompatible. FetchXML admite las opciones de agregación que no están disponibles con el proveedor de consultas LINQ.Más información:Usar el agregado FetchXML

Filtrar varias entidades

Puede crear consultas complejas de Consulta integrada del lenguaje .NET (LINQ) en Microsoft Dynamics CRM 2015 y Microsoft Dynamics CRM Online. Se usan varias cláusulas múltiples de Join con cláusulas de filtro para crear un resultado que se filtra por atributos de varias entidades.

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


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

Using svcContext As New ServiceContext(_serviceProxy)
 Dim query_where3 = From c In svcContext.ContactSet _
                    Join a In svcContext.AccountSet _
                    On c.ContactId Equals a.account_primary_contact.Id _
                    Where a.Name.Contains("Contoso") _
                    Where c.LastName.Contains("Smith") _
                    Select New With {Key .account_name = a.Name,
                                     Key .contact_name = c.LastName}

 For Each c In query_where3
  Console.WriteLine("acct: " &amp; c.account_name &amp; vbTab &amp; vbTab _
                    &amp; vbTab &amp; "contact: " &amp; c.contact_name)
 Next c
End Using

Ver también

Ejemplo: crear una consulta LINQ
Ejemplo: consultas complejas de LINQ
Crear consultas con LINQ (consulta integrada del lenguaje .NET)
Usar clase de entidad de enlace en tiempo de ejecución con una consulta LINQ
Blog: complemento LINQPad para MS Dynamics CRM 2011

© 2017 Microsoft. Todos los derechos reservados. Copyright