Compartilhar via


Usar LINQ para criar um consulta

 

Publicado: janeiro de 2017

Aplicável a: Dynamics 365 (online), Dynamics 365 (on-premises), Dynamics CRM 2016, Dynamics CRM Online

O provedor de consulta do .NET LINQ (Language-Integrated Query) do Microsoft Dynamics 365 (online e local) usa a sintaxe do LINQ padrão. A primeira etapa da criação de uma consulta do LINQ é identificar os tipos de entidade relevantes e os relacionamentos entre eles. É possível especificar a fonte de dados e os outros parâmetros da consulta.

A cláusula from é usada para retornar uma única entidade “raiz”. O provedor de consulta pode retornar somente entidades de um único tipo de entidade. As cláusulas orderby e select devem fazer referência a esta entidade raiz. É possível usar as cláusulas join para adicionar entidades com um relacionamento à entidade “raiz”.

Neste tópico

Operadores do LINQ

Limitações do LINQ

Filtrar várias entidades

Operadores do LINQ

Todas as expressões de consulta do LINQ têm um formato semelhante. A tabela a seguir mostra as cláusulas mais comuns em uma expressão de consulta do LINQ ao usar o provedor de consulta do LINQ do Microsoft Dynamics 365.

Operador do LINQ

Descrição

Exemplo

Obtenha uma fonte de dados (a cláusula from)

Ao usar o contexto de serviço gerado e a associação inicial, use o conjunto de entidades IQueryable, como AccountSet, no contexto gerado.

Quando não estiver usando o contexto gerado, o método CreateQuery no objeto de contexto de serviço da organização permite acesso às entidades Microsoft Dynamics 365.

Como usar o contexto de serviço gerado:

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

Usando o método CreateQuery:

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

cláusula join

A cláusula join representa uma junção interna. Use a cláusula para trabalhar com duas ou mais entidades que podem ser unidas com um valor de atributo comum.

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

Filtrando (a cláusula where)

A cláusula where aplica um filtro aos resultados, geralmente com uma expressão booliana. O filtro especifica quais elementos devem ser excluídos da sequência de origem. Cada cláusula where só pode conter condições para um único tipo de entidade. Um condição composta que envolve várias entidades é inválida. Em vez disso, cada entidade deve ser filtrada em cláusulas where separadas.

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

orderby

O operador orderby coloca os atributos retornados pela consulta em uma ordem especificada.

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

A cláusula select define o formulário dos dados retornados. A cláusula cria um conjunto de colunas com base nos resultados da expressão da consulta. Também é possível definir uma instância de um novo objeto para trabalhar com ela. O objeto recém-criado que usa a cláusula select não é criado no servidor, mas é uma instância local.

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

Limitações do LINQ

O provedor de consulta do LINQ oferece suporte a um subconjunto dos operadores do LINQ. Nem todas as condições que podem ser expressas no LINQ têm suporte. A tabela a seguir mostra algumas das limitações dos operadores básicos do LINQ.

Operador do LINQ

Limitações

join

Representa uma junção interna ou externa. Somente junções externas à esquerda são suportadas.

from

Oferece suporte a uma cláusula from por consulta.

where

O lado esquerdo da cláusula deve ser um nome de atributo e o lado direito da cláusula deve ser um valor. Não é possível definir o lado esquerdo para uma constante. Os dois lados da cláusula não podem ser constantes.

Oferece suporte às funções de String: Contains, StartsWith, EndsWith e Equals.

groupBy

Sem suporte. O FetchXML oferece suporte às opções de agrupamento que não estão disponíveis com o provedor de consulta do LINQ.Para obter mais informações: Use a agregação FetchXML

orderBy

Oferece suporte à ordenação por atributos de entidade, como Contact.FullName.

select

Oferece suporte a tipos anônimos, construtores e inicializadores.

last

Não há suporte para o operador last.

skip e take

Oferece suporte aos operadores skip e take com a paginação do lado do servidor. O valor de skip deve ser maior ou igual ao valor de take.

aggregate

Sem suporte. O FetchXML oferece suporte às opções de agregação que não estão disponíveis com o provedor de consulta do LINQ.Para obter mais informações: Use a agregação FetchXML

Filtrar várias entidades

É possível criar consultas do Microsoft Dynamics 365 complexas no .NET LINQ (Language-Integrated Query) e no Microsoft Dynamics 365 (online). Use várias cláusulas Join com as cláusulas de filtragem para criar um resultado que é filtrado nos atributos de várias entidades.

O exemplo a seguir mostra como criar uma consulta do LINQ que trabalha com duas entidades e filtra os resultados com base nos valores de cada uma das 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

Confira Também

Exemplo: Criar uma consulta LINQ
Exemplo: Consultas de LINQ complexas
Compilação de consultas com o LINQ (Language-Integrated Query do .NET)
Usar classe de entidades late bound com uma consulta do LINQ
Blog: Driver do LINQPad 4 para API REST/Web API do Dynamics CRM disponível no CodePlex

Microsoft Dynamics 365

© 2017 Microsoft. Todos os direitos reservados. Direitos autorais